与其他着色技术相结合的延迟渲染逻辑



我正试图在DirectX-11中创建一个程序,该程序实现了几种技术,即延迟渲染、Phong镶嵌和阴影映射。我在制作phong镶嵌和阴影贴图时没有遇到任何问题,但这是在前向渲染中,所以现在我正在研究延迟渲染,我对如何实现以及在哪个阶段实现这些技术有点困惑。

我认为Phong镶嵌将应用于"几何体"过程,阴影贴图将应用于灯光过程?我想我理解几何体过程中的phong镶嵌,但如果没有几何体信息,如何在灯光过程中创建深度缓冲区?那Phong照明呢?这只是流程后的效果吗?如果您能进一步了解如何使用延迟渲染实现其他着色技术,请提前感谢。

延迟渲染的整个想法是,在几何过程中,将相关几何信息存储在屏幕空间纹理中,这样就可以在光过程中获得这些信息。

  1. 你像往常一样在自己的过程中渲染阴影贴图

  2. 在几何体过程中,您可以像以前一样执行正向渲染的所有操作(尤其是影响几何体的任何操作,如镶嵌)。唯一的区别是,在几何体过程中,像素着色器不进行任何照明计算,而是将照明计算所需的任何信息输出到多个";GBuffer";纹理(通常包括反照率颜色、镜面反射颜色、光泽度、表面法线等)。

  3. 在灯光传递过程中,可以禁用深度测试,并且不绑定深度缓冲区。相反,将几何体过程的深度缓冲区绑定为可读纹理,以及在几何体过程中渲染到的所有GBuffer纹理。然后为每个光源渲染一个四边形。在像素着色器过程中,现在可以使用屏幕上的像素位置对所有这些纹理进行采样(使用SV_Position输入语义和一些简单的数学作为UV)。这将为您提供深度(来自绑定为纹理的深度缓冲区),以及照明计算所需的所有其他信息。您甚至可以使用采样深度(连同屏幕上的像素位置和反向ViewProjection矩阵)来重建在几何体过程中渲染到该像素的几何体的世界空间位置(如果您更喜欢在视图空间中进行照明计算,请单独使用投影矩阵的反向)。这样,您现在可以对阴影贴图进行采样,并执行所有相关的照明计算。

(在像素着色器中使用SV_Position时,请记住在使用前将其所有分量除以w分量。除顶点着色器的输出外,涉及投影矩阵的任何矩阵相乘的结果也是如此)

相关内容

  • 没有找到相关文章

最新更新