2

据我了解,Gouraud着色计算每个顶点的光色并对该颜色进行插值,而Phong着色会插值每个像素的法线并根据该插值计算光色。

然而,当我试图从数学上推导出光色时,我最终得到了两种方式的相同公式!

我为此画的图

(其中n1n2是两个顶点的法线,t是插值的系数,L是光的方向,上面的平面和虚线表示屏幕和一个像素。)

两种方法的浅色派生如下:

  • 古洛:L = t*dot(n1,L) + (1-t)*dot(n2,L)

  • 蓬:L = dot(t*n1+(1-t)*n2,L)

结果是一样的。

谁能告诉我我的推导有什么问题?

4

1 回答 1

3

Gouraud 着色时,光是按顶点计算的(顶点着色器),而在Phong 着色时,光是按片段计算的(片段着色器)。
因此,Gouraud 着色计算图元顶点(角)的光,并为图元覆盖的片段插入光。
使用 Phong 着色,为每个片段单独计算光。

一般来说,光是通过双向反射分布函数计算的。该函数计算光在表面上的反射率,并取决于入射光的矢量、视点和表面的法线矢量。
Gouraud 着色中,顶点颜色(反射率)被插值,而在Phong 着色中,3 个向量被插值。如果函数c = brdf(l, v, n)是线性的,这不会有任何区别,其中c是颜色,l是光方向,v是视图向量,n是法线向量(例如朗伯反射率)。但是如果光照模型不是线性的(例如Blinn-Phong),那么 Gouraud 着色的线性插值会导致不同的结果。

比较Gouraud 着色Phong 着色


另见:
GLSL 固定功能片段程序替换
Phong 和 Gouraud 着色
Gouraud 着色/Phong 着色

于 2020-09-18T15:38:18.933 回答