标签:渲染管线
-
VoxelGI 的实现与它为什么被边缘化 —— 和 SDFGI 的对比
VoxelGI 的 64³ 体素化 + mip 链 + cone tracing 实现细节,以及它在 4.x 被 SDFGI 取代的三条结构性原因。
-
Compatibility 渲染器:GLES3 的 fallback 路径
Compatibility 渲染器不走 RD,而是 Godot 3.x 血统的 GLES3 光栅器直通驱动层。这篇讲它的代码从哪来、为什么不走 RD、哪些特性被静默降级,以及 WebGL2 这个最苛刻目标带来的约束。
-
SSAO 与 SSIL 的近似算法 —— 半分辨率加 upsample 的套路
SSAO 的 spiral 采样数学、SSIL 为什么是同框架的副产品,以及半分辨率 + 深度感知 blur + bilateral upsample 的性能结构。
-
RenderSceneBuffers 与帧缓冲管理:分辨率改变时哪些资源重建了
每个视口的 color/depth/velocity 缓冲都归 RenderSceneBuffersRD 管,配置变更时整套 RID 销毁重建。这篇拆配置结构、重建的触发链与成本,以及 XR 多视角下的 buffer 布局。
-
CanvasItemRenderer:2D 渲染的批处理 —— 上千个精灵怎么合批
2D 命令怎么按状态合批、合批在哪八个断点处被打断,以及静态 canvas 的重绘缓存策略。
-
RenderingDevice 抽象层设计:RID、命令缓冲与提交模型
RenderingDevice 是 Godot 4 渲染栈里最"干净"的一层:RID 句柄、begin/end 式列表 API、submit/sync 提交模型。基于 4.3 源码拆解它怎么把 Vulkan 的复杂度藏起来,以及 4.3 拆出 RenderingDeviceDriver 的意义。
-
后处理链:tonemap/glow/SSAO 的 render pass 顺序 —— 一张像素从场景到屏幕的路
3D 场景的 HDR 画面要经过 SSAO、SDFGI、体积雾、tonemap、bloom、FSR 一串 pass 才上屏。这篇按 4.4 源码顺序拆每个 pass 的输入输出和依赖,告诉你改画质选项时帧时间花在哪。
-
RenderingDevice 多线程提交的限制与坑
RD 的类上挂着 _THREAD_SAFE_CLASS_,方法级互斥没问题,但"同时只能有一个活动列表"和"submit 顺序即 GPU 顺序"两条约束决定了它不能被当成自由的多线程图形 API。这篇列四条实战规则,以及每条背后的源码依据。
-
Shader 缓存与变体编译:首次运行卡顿的来源与预热
Godot 4 的 shader 不是加载时编译好的:SPIR-V 变体按需编译造成首次卡顿,引擎用磁盘 pipeline 缓存和 ubershader 异步编译两招缓解。这篇讲变体组合爆炸的数学、缓存的命中条件,以及导出时预热缓存的正确姿势。
-
LOD 与遮挡剔除的实现现状:Godot 在这块还缺什么
Godot 4.x 的剔除全部发生在 CPU 侧的 RendererSceneCull:视锥、距离、网格 LOD、Portal/Room 都有,但没有 GPU 遮挡查询和节点级自动 LOD。这篇梳理现状的边界,以及每个缺口对应的自救方案。
-
Forward+ 的 cluster shading:光源如何被分配到 cluster
Forward+ 用"屏幕 tile × 深度切片"的三维网格给每个像素预筛光源,把逐像素遍历全部光源的 O(n) 降到 O(1)。这篇给 cluster 索引的数学推导、光源影响域的 AABB 求交,以及 Godot 4.x 的具体参数来源。
-
LightmapGI 烘焙流程与存储格式 —— 烘焙数据进了哪个文件
GPU 光栅化烘焙 indirect light 的五趟 pass、uv2 展开规则,以及 LightmapGIData 里 RGBE9995 纹理和 irradiance 探针的具体布局。
-
SDFGI 原理:有向距离场全局光照 —— 级联体素与探针插值
SDFGI 用每帧体素化的 SDF 加 probe 间接口图集实现动态 GI。这篇推导 cone tracing 的步进公式、probe 烘焙与 cascade 滑动的成本结构。
-
TAA 与 FSR2 集成的插帧位置 —— 时域抗锯齿挂在管线哪一环
TAA 的运动向量从哪来、为什么在几何 pass 里同时写 velocity,以及 FSR2 接管抖动投影后 TAA 的位置怎么变。
-
ParticlesProcessMaterial 的 GPU 模拟:粒子数据全程不进 CPU
GPUParticles3D 的粒子状态全生命周期住在 GPU buffer 里:发射、运动、碰撞、排序都由 compute shader 完成,CPU 只发 dispatch。这篇拆 ParticlesStorage 的 buffer 布局、粒子模拟 shader 的每帧流程,以及为什么"读回粒子位置"这类需求很贵。
-
MultiMesh 的 GPU 实例化上传 —— 一次 draw call 画一万棵树
MultiMesh 把每实例变换折成一个大 SSBO,用 GPU instancing 一次画完。这篇拆实例缓冲的内存布局、可见性裁剪的粒度,以及和 VoxelGI 探针、粒子系统的复用关系。
-
阴影贴图:CSM 级联与阴影 atlas 的分配 —— 定向光阴影的分页管理
定向光的 CSM 级联怎么按距离公式切分、每级有多大,以及局部光的阴影怎么在一张 2048 atlas 里分页复用。含 bias 的单位陷阱。
-
渲染排错实战:Vulkan validation layer 加 RenderDoc 抓帧
黑屏、花屏、自定义 RenderingDevice 代码出了错,标准排查流程是两步:先用 validation layer 把 API 错误排掉,再用 RenderDoc 抓帧定位到具体 pass。这篇给完整流程、典型报错怎么读,以及 Godot 特有的几个坑。
-
decal 与 fog volume 的 cluster 参与:它们怎么挤进光源剔除体系
Forward+ 渲染器把 ClusterBuilderRD 模板实例化了两次:一次给光源,一次给 decal。fog volume 走的却是另一条路——向相机空间的体雾 3D 纹理注入密度。这篇拆两者的参与方式、片元侧的消费逻辑和各自的限额行为。
-
从 RD 到 RDD 的抽象开销实测
4.3 把 RenderingDevice 拆成 RD + RDD 两层后,每次资源操作多走一次虚函数。这篇用一个空操作循环和一次真实抓帧估算这笔开销的量级,结论是:调用开销在 1% 以下,真正的成本在别处。
-
Mobile 渲染器:tile-based GPU 上省带宽的设计取舍
Godot 4 的 Mobile 渲染器和 Forward+ 共享 RD 抽象层,却砍掉了 cluster shading 和一堆屏幕空间效果。砍掉的东西对应的是移动端 GPU 的物理约束:tile 内存容量和外部带宽。这篇按"带宽账本"的思路解释每一项取舍。
-
屏障与同步:RD 怎么隐藏 Vulkan 的 pipeline barrier
Vulkan 的 pipeline barrier 是手写渲染代码时最容易出错的部分。这篇拆 Godot 4.x 的 RenderingDevice 如何记录每个资源的读写历史、在列表结束时自动推导屏障,以及它保留下来的三个显式同步口(barrier / compute_list_add_barrier / sync)。
-
shader 编译链:GLSL 到 SPIR-V 再到 RD 反射
从 .glsl 文件进仓库到 RD 能用的 shader RID,中间隔着构建期 glslang 编译、SPIR-V 字节码打包进 .gen.h、运行期反射解析 UBO 布局三步。这篇按 Godot 4.x 的真实链路逐段讲,包括用户脚本能走的 shader_create_from_source 路径。
-
ClusterBuilder 的 CPU/GPU 分工:每帧光源剔除的真实成本
Godot 4.x 的 ClusterBuilderRD 同时带着 CPU 路径和 compute shader 路径两套光源入桶实现,按设备和配置选路。这篇拆两条路径的实现差异、选择逻辑,以及每帧剔除在 profiler 里到底占多少。
-
渲染驱动多后端:Vulkan/D3D12/Metal 的统一入口
4.3 拆出 RenderingDeviceDriver 后,D3D12 和 Metal 后端在 4.4 起陆续落地。这篇讲 RDD 的职责边界、三个后端文件的翻译策略,以及渲染上下文为什么也要单独拆一层。
-
Sky 渲染与物理大气散射 —— Preetham 模型的 GPU 实现
Godot 天空 shader 怎么用少量积分近似大气单次散射,物理天空的参数怎么映射到 Rayleigh/Mie 系数,以及为什么夜空不是纯黑。