正好周末,可以静下心来跟一遍,我觉得,大象无形是总结,但是还得跟踪代码,要不会出现每个字都认识,但连在一起就不知所云了。
渲染线程其实不陌生了,在DX12中已经单独成为一个线程了,并加入了命令队列,使cpu和GPU异步。我会以后把DX12龙书学习过程记录下来,强迫自己每天学些新东西。
跟代码
1,渲染线程启动:在FEngineLoop::PreInit(),故事将从这里开始,StartRenderingThread()全局函数

跟着代码看,一切都那么顺其自然。
1.1,创建渲染线程类实例

1.2,创建渲染线程

1.3,等待渲染线程准备好从自己的TaskGraph取出任务并执行

1.4,注册渲染线程

1.5,创建渲染线程心跳更新线程

以上就是渲染线程的启动。接下来就是
2,渲染线程的运行。在全局函数RenderingThreadMain(),从并行堆栈中看,其实已经开了个单独的渲染线程了。

完整的调用堆栈在下图


接下来我认为就是如何传递数据从CPU到GPU,如何设置围栏,就像DX12龙书中第一个例子所讲,以后会建立个DX12龙书学习笔记专栏,仔细阐述下,属于先验知识。RHILIST其实就是命令列表。

3,渲染架构
延迟渲染针对不透明物体,相当于先叠加光照贴图、法线、像素深度、粗糙度等图片,再把叠加结果应用于不透明物体,好处是把物体个数与这些贴图的乘法,变成了加法。注意的是,透明物体不适用,它们用前向渲染。半透明是根据深度排序。也就是为什么先处理不透明物体,再处理半透明物体。
这样就有个弊端,用后处理的方式渲染不透明物体时,如何识别这些物体。一个方法是用图像处理的方式处理。比如OPENCV中的各种算法。
本文深入探讨了DX12中渲染线程的工作原理,包括启动流程、运行机制及渲染架构。从StartRenderingThread()函数入手,详细分析了渲染线程的创建、执行与数据传递过程,同时对比了不透明与透明物体的渲染方式。
9375

被折叠的 条评论
为什么被折叠?



