在 Angel Shreiner 书籍“交互式计算机图形学”的第 8 张幻灯片中(此处提供幻灯片),计算光照的建议代码如下所示:
vec3 pos = -(modelViewMatrix*vPosition).xyz;
vec3 L = normalize( lightPosition.xyz - pos );
vec3 E = normalize( -pos );
vec3 N = normalize(modelViewMatrix*vNormal.xyz);
vec3 H = normalize( L + E );
然而,这种方式不仅看起来不对,除非我删除pos
声明中的减号,而且即使我这样做了,照明也过于依赖于观看者的位置(某些部分是黑暗的,如果观看者移动到那里,它就会完全变亮)。如果我在声明中仅使用模型矩阵切换 modelViewMatrix,N
它看起来就像一个魅力。这是本书代码中的错误吗?这是什么数学原因?我想真正了解阴影是如何工作的,但是这本书并不总是很清楚。我想说查看器应该对计算照明的方式产生影响,而不是它在建议的代码中发生的不切实际的方式。