2

我知道传统的 opengl 只支持平面和 gouraud 着色,但我想知道为什么 phong 着色是不可能的?

有人说这是不可能的,因为遗留的opengl丢弃了法线,但我不知道它们在哪里被丢弃,也不知道它们为什么被丢弃。

4

1 回答 1

5

即使是传统的 openGL 也不会丢弃法线。在着色方面的不同之处在于,为了节省着色传统 opgenGL 的时间,仅计算每个顶点位置的着色值,将每个三角形的颜色混合在为顶点计算的 3 种颜色之间。

这种方法也称为Gouraud 着色

另一方面,Phong 着色将为屏幕上渲染的每个像素计算光照值——不仅仅是顶点,并且以某种方式“猜测”所有其他光照值。

猜猜为什么...

很可能选择了Gouraud 着色,因为它涉及的计算量要少得多,它可以实现相对逼真的近似值。

Phong 着色可以实现更逼真的近似值,但计算上的差异可能非常大。

例子

屏幕上显示的单个四边形只需要对顶点进行 4 次或多或少的复杂计算,而在计算时间方面,它们之间的混合会便宜得多。

另一方面,Phong 着色将为构成四边形的每个像素执行光照计算,这可以非常快速地进行大量计算。例如,想象一下您的四边形被光栅化为 (100 x 100) 像素的区域。

根据 int 绘制的顺序形状,如果首先绘制大量模糊对象,则必须执行的每像素计算的数量可能远远大于屏幕的分辨率,因为它们都将通过深度测试只是为了后来透支了。

少了什么东西 ?

旧版 opengl 中缺少的用于执行快速Phong 着色的不是任何丢失或以其他方式丢弃的法线,而是一种非常快速地执行上述每像素操作的方法。这可以通过所谓的Shaders实现。在图形硬件本身上运行的小程序。

旧版 opengl 不允许在如此细粒度的级别自定义渲染过程,因为整个渲染过程只能在所谓的固定功能管道中的几个预定义位置进行 tewaked 。

概括

除了您被告知尝试使用传统 opengl 执行Phong 着色的主要问题之外,不是丢弃任何法线,而是它不是为执行逐像素光照而设计的,而是仅执行逐顶点光照。

于 2013-04-09T20:29:58.093 回答