我知道传统的opengl只支持平面和gouraud阴影,但我想知道为什么不能使用phong着色?
有人说这是不可能的,因为遗留的opengl丢弃法线,但我不知道它们被丢弃的地方以及它们被丢弃的原因。
答案 0 :(得分:5)
即使是传统的openGL也不会丢弃法线。阴影的不同之处在于,为了节省阴影时间,传统的opgenGL只计算每个顶点位置的阴影值,为顶点计算的3种颜色之间的每个三角形混合颜色。
此方法也称为 Gouraud着色。
另一方面,Phong着色将计算屏幕上呈现的每个像素的光照值 - 不仅仅是针对顶点,还会以某种方式“猜测”所有其他光照值。
很可能选择了 Gouraud阴影,因为它涉及的计算量要少得多,它可以实现相对逼真的近似。
Phong着色可以实现更逼真的近似,但计算上的差异可能非常大。
屏幕上显示的单个四边形只需要4个或多或少复杂的顶点计算,而在这些顶点之间进行混合会比计算时间便宜得多。
另一方面,Phong阴影将对构成四边形的每个像素执行光照计算,这可以非常快速地进行大量计算。想象一下,例如,你的四边形被光栅化为(100 x 100)像素的区域。根据绘制的顺序形状,如果首先绘制了大量模糊对象,则必须执行的每像素计算的数量可能会大大超过屏幕的分辨率,因为它们都将通过深度测试只是为了稍后透支。
执行快速 Phong着色的旧版opengl中缺少的不是任何丢失或以其他方式丢弃的法线,而是一种非常快速地执行上述每像素操作的方法。这可以通过所谓的着色器实现。在图形硬件上运行的小程序。
传统的opengl不允许在如此细粒度的水平上自定义渲染过程,因为整个渲染过程只能在所谓的固定功能管道中的几个预定义位置进行混合处理
除了你被告知使用传统opengl尝试执行 Phong Shading 的主要问题不是任何法线被丢弃,而是它不是设计用于执行每像素照明,但只有每顶点照明。