为何OpenGL漫反射光照计算的方向向量指向与预期相反?
问题解答
首先明确空间向量的基础计算规则:对于两个空间点A和B,A - B 得到的向量方向是从B指向A,因此lightPos - FragPos 计算得到的自然是从片元位置指向光源位置的向量。
之所以要使用这个方向作为光照计算的lightDir,是由LearnOpenGL教程采用的漫反射计算约定决定的:
- 漫反射的核心计算是表面法向量和光线方向的点积,教程中采用的公式为:
float diffuseStrength = max(dot(normal, lightDir), 0.0); - 其中
normal是片元的表面法向量,默认方向是从片元指向模型外侧。我们需要当光线从表面正面入射时,点积结果为正,对应更高的漫反射亮度。如果使用从光源指向片元的向量作为lightDir,此时它和法向量的夹角是实际入射夹角的补角,点积结果会为负,代入公式后会直接被截断为0,得到完全错误的无光照结果。
当然这只是约定区别,如果你希望lightDir定义为光线入射方向(从光源到片元),只需要同步修改点积逻辑即可:
vec3 lightDir = normalize(FragPos - lightPos); float diffuseStrength = max(dot(normal, -lightDir), 0.0);
两种写法的计算结果完全一致,只是参数定义的约定不同而已。
内容的提问来源于stack exchange,提问作者OpenGLUser
相关产品推荐
相关产品推荐

