GLSL 中的 Phong Shading 是如何实现的?

How is Phong Shading implemented in GLSL?

我正在 GLSL 中为一项任务实现 Phong 着色器,但我没有得到应有的镜面反射。我理解它的方式,它与 Gouraud Shading 相同,但不是在顶点着色器中进行所有计算,而是在片段着色器中进行计算,以便对法线进行插值,然后在每个像素处应用 phong 模型。作为任务的一部分,我还必须开发 Gouraud 着色器,它按预期工作,我认为您只需要将顶点着色器代码放入片段着色器中,但事实并非如此。

我在顶点着色器中所做的只是将顶点位置转换为视图坐标,并将模型视图矩阵的转置逆应用到顶点法线。然后,在片段着色器中,我只将视图变换应用到光源位置,并使用这些坐标来计算 Phong 模型中所需的向量。光照几乎是正确的,但缺少一些镜面光。所有参数都已经过测试,所以我假设是光的位置错误,但我不知道为什么我的代码在其他着色器中无法正常工作。另外,我知道这不是最有效的方法(预先计算法线矩阵会更快),我只是想先让它正常工作。

问题在于光源位置的计算方式。以下代码

vec3 l = normalize(mat3(VMatrix)*light);

将光线视为一个方向(通过对其进行归一化,因为忽略了视图矩阵的平移部分),但它实际上是一个位置。正确的代码应该是这样的

vec3 l = (VMatrix * vec4(light, 1.0)).xyz