自由学习记录(136)

**Curvature Shading(曲率着色/曲率渲染)**在很大程度上依赖于检查和分析顶点法线(Vertex Normals)以及由它们插值得到的表面法线 。计算邻近顶点法线之间的变化速率来衡量表面曲率。

overflow-visible! 复制代码

per-pixel curvature shading

Material Graph 没有 curvature。

但如果改引擎:

可以在 GBuffer 加一个 channel:

overflow-visible! 复制代码

GBufferD = curvature

shader 质量会立刻提升。

纯数学上讲,Disney BRDF、GGX 变体、Charlie、Burley diffuse、multi-scatter compensation,这些全都只是函数:

  • 输入:N、V、L、roughness、metallic、anisotropy、clearcoat...

  • 输出:f(l, v)

在这个意义上,你说得对,它们都不要求改源码。只要给你一个足够自由的 shader 环境,你就能实现。

"能不能被当前引擎路径正确使用"。

在 UE 里,如果你只是在 Material Graph 或 Custom 节点里写一个 BRDF 公式,你通常只是做了下面几种事之一:

  1. 伪装成 BaseColor / Emissive / Specular 的某种近似输出

  2. 在默认 lighting model 上叠加一个 correction term

  3. 在 Forward/Unlit 里自己做一部分假光照

源码的情况:

  • 想让新 BRDF 进入 deferred lighting 主循环

  • 想让它参与所有灯光类型的一致受光

  • 想匹配 skylight / reflection capture / SSR / Lumen 反射

  • 想新增 shading model

  • 想扩展 GBuffer 通道承载新参数

  • 想做正确的预积分 LUT、重要性采样和 IBL 配套

"Disney BRDF 变体作为数学函数本身,不需要改源码;但要把它作为 UE 中完整、正确、一致、可维护的渲染模型使用,通常需要改源码。"

  • 我不要只在某个材质球上 fake 一下

  • 我要它进主光照路径

  • 我要它和全局反射、阴影、GBuffer、灯光循环协同工作

  • 我要它能规模化给整个项目用

这就从"数学实现"变成"渲染架构实现"了。

效果怎么规模化给几十个场景、几百个材质用规模化给几十个场景、几百个材质用混合多种追踪技术(屏幕追踪、网格体距离场追踪),在即时生成光线反弹的同时,结合 Nanite 几何体进行表面缓存缓存到物体的表面(表面缓存)(Surface Cache)

  • Ray Tracing (光线追踪): 这是一个总称。它是一套完整的渲染技术体系,包含了很多子项目。

  • Ray Traced Reflections (光追反射): 它是光线追踪技术里的一个具体应用方向

  • 如果说 Ray Tracing 是"运动",那么 Ray Traced Reflections 就是其中的"跑步"。除了反射,光线追踪还包括:

    • Ray Traced Shadows (光追阴影): 让阴影边缘更自然,远近虚实更真实。
    • Ray Traced Global Illumination (光追全局光照/RTGI): 模拟光线在物体表面多次弹射后的颜色干扰,让室内光线更柔和。
    • Ray Traced Ambient Occlusion (光追环境光遮蔽/RTAO): 强化物体缝隙处的阴影,让物体更有立体感。


    Ray Tracing (名词词组):

    • 这是一个动名词 结构,代表的是**"这项技术本身"**。

    Ray Traced (过去分词作形容词):

    • 这是一个被动语态 的用法,意思是**"经过光追处理的"**。
    • Ray Traced Reflections 翻译为"经过光追渲染的反射"。这里的 Ray Traced 用来修饰后面的 Reflections (反射)。

    虽然它们的核心都是"光线追踪",但在逻辑表达上,它们侧重点不同:

    • Ray Tracing主语/技术名
    • Ray Traced [某物]渲染结果

    虚幻引擎(Unreal Engine, 简称UE)中,

    CSMCascaded Shadow Maps 的缩写,中文翻译为级联阴影贴图层级阴影贴图 。用于处理平行光(Directional Light,通常是太阳光)动态阴影CSM 是实时开放世界或室外大场景中,单纯使用单一的阴影贴图,要么近处阴影有锯齿,要么远处阴影模糊。阴影分为几层,能兼顾近处细腻和远处阴影覆盖层级越多、距离越远,对 GPU 和 CPU 的负荷就越大。Distribution Exponent (分布指数): 决定近处和远处层级之间的划分权重。Transition Fraction (过渡比例): 用于平滑相邻阴影层级之间的过渡,防止锯齿突变在 UE5 中,虽然传统的 CSM 仍在广泛使用,但更高级的 VSM(Virtual Shadow Maps,虚拟阴影贴图) 被引入,能提供更细腻且基于像素的阴影,成为大场景的主流方案。 阴影贴图分割成虚拟小块并在需要时动态加载,能实现高清、稳定且无虚化效果(高细节)的动态阴影,并完美配合Nanite和Lumen系统使用。划分为小的"页"(Pages),仅在需要时分配和计算屏幕可见区域内的阴影,总结来说,VSM 是 UE5 渲染引擎的核心功能,让开发者可以在实时渲染中获得堪比离线渲染的电影级阴影效果。王鑫 (库洛游戏《鸣潮》图形渲染组长)

    目前的实现中,它们的虚拟分辨率为16k x 16k像素。

    https://www.bilibili.com/video/BV1hSW4zTEgQ/?vd_source=8edbc527019213f5a0f28f3a4b395636

    https://zhuanlan.zhihu.com/p/1967117197915693977
    魔改UE5的Lumen方案并移植到UE4.26,结合硬件光追与自研模块,在开放世界卡通渲染中达成了4060显卡2K分辨率60帧的性能目标。光追反射、全局光照和阴影三大效果

    ReSTIR
    (时空重要性重采样)是一种用于实时路径追踪的尖端算法,旨在通过在空间和时间上重采样光线样本,从而高效处理大量动态光源并显著降低间接光照的噪声。它利用前一帧和相邻像素的样本来优化当前样本质量,非常适合实现高质量的动态全局光照(GI),例如 UE5 的 Lumen技术

    ReSTIR 路径追踪的关键要素:

    • 核心原理: ReSTIR(Spatiotemporal Reservoir Resampling )通过构建"采样水库"(Reservoir)来存储和重用有效的光线样本,以提高对复杂光照的贡献度。
    • 空间重采样: 在当前帧中,将像素与其相邻像素的样本进行重采样,利用空间上的信息来传播高质量样本。
    • 时间重采样: 将当前帧的样本与上一帧对应的像素样本进行重采样,从而在时间上重用旧的样本,减少画面闪烁。
    • 应用场景: 主要用于实时渲染(RTGI),在处理数百万个动态光源时,能够以较少的采样数实现高画质。
    • 主要优势: 相比传统的路径追踪,ReSTIR 极大地降低了蒙特卡洛积分的噪声,在保证实时性的同时获得高质量的全局光照效果。

    https://zhuanlan.zhihu.com/p/407945117#CTZ_DEFAULT

    这是 Spatial(空间)Temporal(时间) 的合成词。

    • Temporal (时间): 指算法会"记住"上一帧渲染出的优秀光照样本。既然画面每秒更新 60 次,前后两帧的变化通常很小,直接复用上一帧的数据能极大减少重复计算。
    • Spatial (空间): 指屏幕上相邻的像素通常受相似光源的影响。算法会让像素之间互相"交流"光照信息,如果邻居找到了一个很亮的光源,它会把这个信息分享给你。
    • 在统计学中,蓄水池采样(Reservoir Sampling) 是一种从海量流式数据中等概率选取样本的方法。

    • 在渲染中,每个像素都有一个"蓄水池",它并不存储成千上万个光源,而是只存储**极少数(通常只有 1 个)**最有代表性的光源样本,以及一个代表该样本权重的值。这让内存消耗极低。

    • 算法并不是随机选一个灯光就结束了,而是通过不断地将"旧样本"(来自上一帧或邻居)与"新生成的随机样本"进行对比。

    • 通过重要性重采样(Importance Resampling),算法能自动剔除那些对画面亮度贡献微弱的光源,最终在蓄水池里留下那个最能照亮该像素的"核心光源"。


    每一个像素都准备一个小本本(Reservoir ),通过不断地翻看自己上一秒记录的、以及周围邻居记录的优秀灯泡信息(Spatiotemporal ),来反复筛选(Resampling )出那一束最能照亮自己的光。这种"抄作业"会导致的**画面残留(Ghosting)**怎么解决?

    Material Graph 属于 shading expression layer ,而不是 rendering architecture layer多画面结果其实决定于"这个像素是怎么被看见、怎么被照亮、怎么被积累、怎么被缓存"的整套流程。GBuffer layout:为什么材质图改不了"材质语义"UE 的 deferred path 里,Material Graph 最终输出的并不是"最终画面"

    关于 Spatiotemporal Reservoir Resampling (ReSTIR),目前最值得看的演示主要集中在 NVIDIA 的官方技术 Demo、学术成果展示以及集成该技术的顶级 3A 游戏。

    以下是几个最具有代表性的 Demo 和视频:

    1. NVIDIA 官方技术演示 (RTXDI 系列)

    NVIDIA 将 ReSTIR 商业化后命名为 RTXDI (RTX Direct Illumination)。

    • Bonsai Diorama (盆栽场景) Demo\]: 这是 2025 年最新的演示,基于 Unreal Engine 5.6。它不仅展示了 ReSTIR 对海量动态光源的处理,还结合了 RTX Mega Geometry(处理数亿个三角形的微几何技术),是目前画质最顶尖的演示之一。

    • SIGGRAPH 2020 原始演示视频\]: 即使是几年前的视频,它依然最直观。视频中展示了"百万光源"场景(如一个装满发光球体的房间),你可以清楚地看到即使没有去噪器(Denoiser),ReSTIR 也能迅速收敛到纯净的画面。 \[1, 2, 3, 4, 5, 6

    2. 游戏中的实战演示

    如果你想看这项技术在实际游戏里的表现,以下两个案例是"教科书级"的:

    • 《赛博朋克 2077》光线追踪:超速模式 (Overdrive Mode):
      • 该模式是 ReSTIR GI(全局光照)的大规模应用场景。它处理了夜之城数以万计的霓虹灯、车灯和广告牌。开启后,你会发现所有动态物体(如行驶的车辆)都能实时投射出准确的彩色阴影和反光。
    • Portal with RTX》(传送门 RTX 版):
      • 这个 Demo 证明了 ReSTIR 如何通过"时空复用"让老游戏焕发新生。它将原本简单的光源替换为物理正确的光源,利用 ReSTIR 实现实时路径追踪。 [7]

    3. 开源实现与交互式工具

    如果你想亲自"上手"调参数,可以看这些开源项目:

    • NVIDIA RTXDI SDK (GitHub)\]: NVIDIA 官方在 GitHub 上开源了 [RTXDI 的示例项目](https://github.com/NVIDIA-RTX/RTXDI "RTXDI 的示例项目"),包含 MinimalSample(最小化实现)和 FullSample(完整渲染管线),适合开发者研究。

    观看建议

    在观看这些 Demo 时,你可以重点留意以下"马赛克"相关的现象:

    1. 收敛速度:看摄像机快速转动时,画面是否会瞬间变模糊(重采样过程),然后又迅速变得极其清晰。
    2. 动态光源:看那些高速运动的灯泡,阴影是否能实时跟上且不产生"拖影"。
    3. 邻居交流:如果关闭"空间复用",你会看到画面变回满是细碎噪点的状态;开启后,噪点会立刻聚拢成平滑的光影。

    1\] [https://developer.nvidia.com](https://developer.nvidia.com/blog/nvidia-rtx-advances-with-neural-rendering-and-digital-human-technologies-at-gdc-2025/ "https://developer.nvidia.com") \[2\] [https://www.youtube.com](https://www.youtube.com/watch?v=w4Sz5FM0ZUs&t=3 "https://www.youtube.com") \[3\] [https://www.youtube.com](https://www.youtube.com/watch?v=3qyoaqAxe9E&t=3 "https://www.youtube.com") \[4\] [https://www.youtube.com](https://www.youtube.com/watch?v=5o1__MkbtVk "https://www.youtube.com") \[5\] [https://www.youtube.com](https://www.youtube.com/watch?v=HiSexy6eoy8#:~:text=NVIDIA%20and%20Dartmouth%20College%20researchers%20collaborated%20to,rendering%20of%20scenes%20with%20many%20dynamic%20lights%2C "https://www.youtube.com") \[6\] [https://research.nvidia.com](https://research.nvidia.com/publication/2020-07_spatiotemporal-reservoir-resampling-real-time-ray-tracing-dynamic-direct "https://research.nvidia.com") \[7\] [https://www.youtube.com](https://www.youtube.com/watch?v=AH8xSgcRuEQ "https://www.youtube.com") \[8\] [https://github.com](https://github.com/Trylz/Restir_CPP "https://github.com") \[9\] [https://github.com](https://github.com/NVIDIA-RTX/RTXDI "https://github.com") \[10\] [https://github.com](https://github.com/karel-tomanec/Falcor-ReSTIR "https://github.com") **虚幻引擎 (Unreal Engine)** 默认采用的是 **延迟渲染路径** **(Deferred Rendering Path)** 。虽然它也支持 **前向渲染 (Forward Rendering)**(主要用于移动端、VR 或需要高性能抗锯齿的场景),但其核心桌面和主机端的功能(如 Nanite 和 Lumen)都是围绕延迟渲染架构构建的。

  • 解耦几何与光照 :通过 G-Buffer(几何缓冲区)存储深度、法线和材质属性,复杂的材质计算只需进行一次,后续光照阶段直接读取这些信息。

  • 复杂特效支持 :许多现代视觉特性(如屏幕空间反射 SSR、环境光遮蔽 SSAO 以及 UE5 的 Lumen 动态全局光照)在延迟管线下实现起来更为高效。

  • 内存带宽压力 :由于需要维护庞大的 G-Buffer,延迟渲染对显存带宽的要求较高。半透明渲染痛点 :由于 G-Buffer 只存储每个像素最前面的一层信息,半透明物体 通常需要切换回前向渲染模式来单独处理。抗锯齿限制 :延迟管线天然不支持传统的 MSAA (多重采样抗锯齿),因此 UE 默认强力推行 TAATSR (时域超分辨率)等方案。渲染管线是一个大框架(通常分为应用阶段、几何阶段、光栅化阶段),而几何阶段是其中的第二个主要阶段


    宏观结果 来看,渲染管线的终点确实就是输出一帧(Frame) 图像。 微观运行上,为了追求极致的性能,管线并不是"走完一个零件再生产下一个",而是像真正的工业流水线一样:

  • 当 GPU 正在处理第 N 帧的光栅化时;

  • 几何阶段可能已经在处理第 N+1 帧的顶点了;

  • 而 CPU 可能正在准备第 N+2 帧的数据

  • 这种设计确保了 GPU 的各个硬件单元始终保持忙碌,从而提高 帧率(FPS)

    时间单位的衡量

    • 吞吐量(Throughput):也就是你说的,单位时间内吐出多少帧(比如 60 FPS,意味着每 16.6ms 吐出一帧)。
    • 延迟(Latency):指单个顶点或像素从进入管线到显示在屏幕上经历的总时长。

    延迟的具体定义

    在渲染管线中,延迟是指:从 CPU 开始处理某一帧的数据,到这一帧最终显示在显示器上所经历的总时间。

    我们可以把这一帧的"旅程"拆解为几个关键耗时点:

    • 输入延迟 (Input Latency):你按下鼠标或键盘,信号传给 CPU 的时间。
    • 处理延迟 (CPU/App Latency):CPU 计算游戏逻辑、物理碰撞、准备提交给 GPU 的渲染命令(Draw Calls)的时间。
    • 几何延迟 (Geometry Latency):GPU 接收到顶点数据,进行坐标变换、裁剪、投影的时间。
    • 光栅化/着色延迟 (Rasterization/Shading Latency):GPU 把几何图形变成像素并涂上颜色的时间。
    • 显示延迟 (Display Latency):显卡把渲染好的帧传给显示器,显示器刷新出画面的时间。

    为什么"帧率高"不代表"延迟低"?

    这是一个常见的误区。想象一条超长的流水线:

    • 高吞吐量(高 FPS):流水线终点每秒钟能吐出 144 个零件(144 FPS)。

    • 高延迟(Latency):但每个零件由于流水线太长,从头走到尾需要 500 毫秒。

    • 结果 :你在屏幕上看到的画面确实很丝滑,但你动一下鼠标,画面要在半秒钟后才会有反应。这就是典型的输入延迟

    • 闭"三重缓冲(Triple Buffering)",虽然可能导致画面撕裂,但能减少一帧在显存里的排队时间。


    逻辑与指令准备 (App Stage)
    管线的起点提交指令 (Draw Call Submission) :CPU 需要告诉 GPU"画这个、画那个"。如果 Draw Call 数量爆炸(比如一万个独立的小石头),CPU 在组织这些命令时会消耗大量时间,把 3D 模型的顶点从模型坐标转到屏幕坐标。如果模型面数(Triangle Count)极高,或者骨骼动画极其复杂,GPU 的几何单元就会超负荷。带宽压力 (Memory Bandwidth) :频繁读写显存里的贴图数据,如果显存频率不够,数据传输也会产生等待耗时。

    显示输出 (Display/V-Sync)
    *

    如果开启,显卡必须等显示器刷新卡 10ms 画完,但显示器 16.6ms 才刷新一次,显卡就得干等 6.6ms。面板延迟 :显示器接收到信号到像素点亮,物理上也需要几毫秒。Profiler(性能分析工具) 确实无法在一个界面里直接给你一个从"手点下去"到"屏幕发光"的总延迟(End-to-End Latency)

    rofiler 看不到的(隐形成本)

    • 驱动开销(Driver Overhead):指令在进入 GPU 硬件之前的排队时间,Profiler 有时难以精准捕捉。

    如何测量 Profiler 看不到的部分?

    为了测量真实的全链路延迟,业内通常使用以下方法:

    • 硬件方案 (LDAT):NVIDIA 有专门的硬件工具(Latency Display Analysis Tool),一头连着鼠标,一头贴在屏幕上,直接测量点击到光变的物理时间。
    • NVIDIA Reflex SDK:通过在代码中植入标记,让 CPU、GPU 和驱动程序"互相通气",从而在软件里模拟出全链路延迟的各个组成部分。
    • 高速摄像机:最原始但也最准的方法。用 1000fps 的相机拍手部动作和屏幕变化,数中间差了多少帧。

    UE 是如何处理的?

    • 默认方案 :UE 的桌面端延迟渲染通常使用 TAA (Temporal Anti-Aliasing)TSR (Temporal Super Resolution) 。这些方案利用时域信息(上一帧的数据)来平滑边缘,成本极低且能处理着色器高频噪点(Specular Aliasing)。
    • MSAA 的保留地 :在 UE 中,MSAA 仅在 前向渲染 (Forward Shading) 模式下可用。这也就是为什么在开发注重画面清晰度的 VR 项目移动端项目 时,官方文档通常会指导开发者切换到前向渲染器

    MSAA 的核心在于几何阶段对每个像素进行多次采样,并在这些子采样点之间进行深度测试。然而,延迟渲染将几何与光照解耦。在光照阶段,显卡只看到 G-Buffer (纹理数据),不再拥有物体的几何边缘信息,因此无法直接利用硬件 MSAA 进行边缘平滑。如果强行在延迟管线中开启 MSAA,为了让光照计算在子采样级别上保持正确,每一个采样点都需要存储一套完整的 G-Buffer 数据(法线、粗糙度、颜色等)。

    • 显存需求:如果开启 4x MSAA,G-Buffer 的体积会翻 4 倍,极易撑爆显存。
    • 计算压力:光照阶段的计算量也会成倍增加,因为原本按像素进行的着色可能需要按采样点进行,这会让延迟渲染"处理成百上千光源"的优势荡然无存

    MSAA 的采样发生在"光栅化(Rasterization)"阶段 ,也就是几何数据(三角形)转化为像素碎片的转折点。之前的表述是为了简化理解,将"光栅化"这个衔接步骤笼统地归在了广义的几何处理流程中。更精确的解释如下:需要显存支持: 开启 MSAA 时,渲染目标(Render Target)需要多倍的深度和模板缓存(Render Target 大小可能翻倍或更多),这对显卡内存的带宽和容量有很高的要求

    MSAA 如何在显卡上运行?

    • 光栅化采样: 现代GPU光栅化器通过判断一个三角形是否被像素内的多个样本覆盖来实现。
    • 多采样缓冲: GPU利用专用的帧缓冲区存储这些覆盖样本。
    • 解析(Resolve): 最终,这些样本被解析并平均成一个最终像素颜色。

    MSAA的局限性(非技术限制,而是架构限制)

    • 延迟渲染不兼容

    延迟渲染在像素着色阶段已经丢失了物体边界的几何信息。正向渲染(Forward Rendering)中表现优异,但不支持大多数现代游戏采用的延迟渲染(Deferred Shading) ,因为延迟渲染在像素着色阶段已经丢失了物体边界的几何信息。

    MSAA(多重采样抗锯齿)不算作严格意义上的 Shader(着色器)程序

    ,它是一种硬件渲染特性图形管线技术 。具体来说:它是渲染流程的一环:

    MSAA 工作在片段着色器(Fragment Shader)执行之后、光栅化之后,负责对计算出的颜色进行多次采样和平均,以减少边缘锯齿。

    https://www.blurredcode.com/2022/02/5b548f07/#:~:text=MSAA%E7%9A%84%E5%AD%90%20sample%20%E4%BF%9D%E5%AD%98,MSAA%E6%98%AF%E6%97%A0%E6%84%8F%E4%B9%89%E7%9A%84%E3%80%82

    强调布


    利用高带宽MRT(多目标渲染)需要GPU硬件支持MRT技术同一个Pass中向多个RenderTarget写入数据。显存带宽较窄的设备(如部分移动端GPU)上,延迟渲染可能导致性能下降硬件解决方案 :现代移动端通过分块延迟渲染(Tile-Based Deferred Rendering, TBDR)将场景分块,利用片上内存(On-chip Memory)缓存G-Buffer,避免频繁读写显存,从而在高通骁龙等GPU上实现高效的延迟渲染。必须支持多目标渲染。 需要大容量显存存储G-Buffer。

    假设你想做一个更完整的各向异性 BRDF,需要额外参数:

    • anisotropy strength

    • anisotropy direction

    • maybe secondary lobe weight

    如果默认 GBuffer 没有空间存这些量,你在 Material Graph 里即使能算出来,也很难把它们完整传递给后续 deferred light loop。

    能做的通常只有几种折中:

    • 挤占已有通道,牺牲别的语义

    临时在某个 pass 里 fake改成 forward 或 unlit 近似处理

    真正系统化的办法是改:

    • GBuffer packing

    • material template

    • deferred shading decode

    • light integration path

    光照积分方式:为什么你能改 BRDF 输入,但不能改整个受光机制Material Graph 里你可以输出:

  • Roughness

  • Normal

  • BaseColor

  • F0 近似

  • ClearCoat input

  • Subsurface input

  • 但真正的 direct lighting / indirect lighting 是由引擎固定积分方式算的。 也就是说,Material Graph 只能影响:

    BRDF 的参数输入

    但不能直接决定:

    • 灯光循环怎么遍历

    • NDF / G / F 的具体组合逻辑

  • 多光源累加如何处理

  • IBL 用什么 LUT / prefilter

真正的光照一致性来自:

  • direct light BRDF

  • indirect specular BRDF

  • probe / capture prefilter

  • LUT 预积分假设

  • shadow term / visibility term 组合

这些都不在 Material Graph 权限里。

Material Graph 能说:

这个表面比较粗糙,法线朝这边,反照率是这个。

但它不能说:

引擎,从今天开始请按新的光照数学来解释这些属性。

shadowing pipeline:为什么材质能"看起来像在影响阴影",但其实没改阴影系统

  • 用 AO、curvature、mask 做局部压暗

  • 用 Fresnel / view term 假装接触阴影

  • 用 Dither / PDO 做接地过渡

  • 用 emissive/opacity 做风格化假受光

这些都能显著改变观感,但它们不是"阴影系统本身"。

真正的 shadowing pipeline 包括:

  • shadow map / VSM / VSM page / CSM / VSM resolve

  • shadow depth pass 怎么生成

  • filtering 策略(PCF、PCSS、EVSM、MSM 等)

  • receiver bias / normal bias

  • contact shadow

  • ray traced shadow / distance field shadow

  • translucency shadow handling

  • virtual shadow map residency 和 page cache

这些是 visibility + light occlusion 的系统,不是材质图层面的局部表达。

相关推荐
EnglishJun2 小时前
ARM嵌入式学习(二) --- 入门51(中断)
arm开发·学习
for_ever_love__2 小时前
Objective-C学习 NSArray 和 NSMutableArray 功能详解
学习·ios·objective-c
Pyeako2 小时前
自然语言学习--bert框架
人工智能·深度学习·学习·bert·lstm·自然语言学习
载数而行52010 小时前
QT的五类布局
c++·qt·学习
载数而行52011 小时前
QT的QString类
c++·qt·学习
zl_dfq11 小时前
Python学习2 之 【数据类型、运算及相关函数、math库】
学习
2301_7811435613 小时前
C语言学习笔记
笔记·学习
Alphapeople15 小时前
Isaac Sim学习
学习
蒸蒸yyyyzwd15 小时前
高并发40问学习笔记
笔记·学习