Directx 为什么要在像素着色器中实现照明?

Directx 为什么要在像素着色器中实现照明?,directx,hlsl,lighting,pixel-shader,Directx,Hlsl,Lighting,Pixel Shader,我正在阅读Frank D.Luna的DirectX 11 3D游戏编程简介,似乎不明白为什么我们要在像素着色器中实现照明?如果你能寄给我一些关于这个问题的参考资料,我将不胜感激 谢谢。照明有很多方法。有数百篇关于这个主题的论文 对于游戏,有几种常见的方法(或者更常见的是,游戏将采用这些方法的混合) 静态照明或光照贴图:通常使用全局照明解算器脱机计算照明,并将结果烘焙到纹理中。它们在运行时与基础漫反射纹理混合,以创建复杂阴影和微妙照明的感觉,但实际上没有任何变化。光照贴图的好处在于,您可以捕获非

我正在阅读Frank D.Luna的DirectX 11 3D游戏编程简介,似乎不明白为什么我们要在像素着色器中实现照明?如果你能寄给我一些关于这个问题的参考资料,我将不胜感激


谢谢。

照明有很多方法。有数百篇关于这个主题的论文

对于游戏,有几种常见的方法(或者更常见的是,游戏将采用这些方法的混合)

  • 静态照明或光照贴图:通常使用全局照明解算器脱机计算照明,并将结果烘焙到纹理中。它们在运行时与基础漫反射纹理混合,以创建复杂阴影和微妙照明的感觉,但实际上没有任何变化。光照贴图的好处在于,您可以捕获非常有趣和复杂的照明技术,这些技术的计算成本非常高,然后以非常便宜的价格“重放”它们。限制是您不能移动灯光,尽管有一些技术可以在顶部层叠数量有限的动态灯光

  • 延迟照明:在这种方法中,场景被渲染多次以将信息编码到屏幕外纹理中,然后进行额外的过程以计算最终图像。这里,场景中每个灯光通常有一个渲染过程。看见延迟着色的好处在于,可以很容易地使用艺术驱动的内容来缩放渲染器,而不受太多的硬限制——例如,您可以对更多的灯光进行更多的传递,这些灯光只是简单的相加。延迟着色的问题是,每一个过程的计算量都很小,而且许多过程确实会对现代GPU的内存带宽产生很大的影响,因为现代GPU的计算能力比带宽大得多

  • 每面前方照明:这通常称为平面照明。这里,使用面法线对每个三角形/多边形执行一次照明。在现代GPU上,这通常在可编程顶点着色器上完成,但也可以使用几何体着色器来计算每面法线,而不必在顶点中复制它。结果不是很逼真,但绘制成本很低,因为每个面的颜色都是恒定的。这真的只在你想要一个“Tron外观”或其他技术的时候使用

  • 顶点前向照明:这是经典照明,其中光线计算是使用逐顶点法线逐顶点执行的。然后在三角形/多边形()的面上插值每个顶点处的颜色。这种照明很便宜,在现代GPU上可以在顶点着色器中完成,但对于许多复杂材质,结果可能过于平滑,并且任何镜面反射高光都会变得模糊或丢失

  • 每像素正向照明:这是您问题的核心:这里的照明是每像素计算一次。这可能类似于经典或着色,其中法线在顶点之间插值,或者第二个纹理提供曲面的法线信息。在现代GPU中,这是在像素着色器中完成的,可以提供更多的曲面信息、更好的镜面反射高光、粗糙度等,但需要花费更多的像素着色器计算。在现代GPU上,相对于内存带宽而言,它们往往具有很大的计算能力,因此与过去相比,每像素照明非常便宜。事实上,技术在现代游戏中非常流行,这些技术往往具有非常长且复杂的像素着色器,将场景中每个表面上每个像素的6到8个纹理的数据组合在一起

这是一个非常粗略的调查,正如我所说,关于这个话题有大量的书籍、文章和背景

您的问题的简短答案是:因为我们可以