镜面反射光照出现在对象的正面和背面



我正在写一个关于Phong着色的小测试,并且试图让镜面反射组件工作。它似乎工作正常,除了镜面光同时应用于对象的前部和后部。(对象本身是透明的,人脸在 CPU 端手动排序。

请注意,漫反射组件工作得很好(只出现在面向光源的一侧)——我认为这似乎排除了法线到达片段着色器的问题。

据我了解,镜面反射分量与眼睛矢量和反射光矢量之间角度的cos成正比。

为了使事情变得非常简单,我的测试代码尝试在世界空间中执行此操作。相机位置和光矢量分别硬编码(抱歉)为(0,0,4)(-0.707, 0, -0.707)。因此,眼睛矢量是(0,0,4) - fragPosition

由于模型矩阵仅

执行旋转,因此顶点着色器仅通过模型矩阵转换顶点法线。(注意:这不是好的做法,因为许多类型的变换不保留正常的正交性。通常对于普通矩阵,应使用模型矩阵左上角 3x3 的逆转置。为简单起见,片段着色器在单个浮点颜色通道上运行,并跳过镜面反射指数(/使用指数 1)。

顶点着色器:

#version 140
uniform mat4 mvpMtx;
uniform mat4 modelMtx;
in vec3 inVPos;
in vec3 inVNormal;
out vec3 normal_world;
out vec3 fragpos_world;
void main(void) {
  gl_Position = mvpMtx * vec4(inVPos, 1.0);
  normal_world = vec3(modelMtx * vec4(inVNormal, 0.0));
  fragpos_world = vec3(modelMtx * vec4(inVPos, 1.0)); 
}

片段着色器:

#version 140
uniform float
    uLightS,
    uLightD,
    uLightA;
uniform float uObjOpacity;
in vec3 normal_world, fragpos_world;
out vec4 fragOutColour;
void main(void) {
    vec3 vN = normalize(normal_world);
    vec3 vL = vec3(-0.707, 0, -0.707);
    // Diffuse:
    // refl in all directions is proportional to cos(angle between -light vector & normal)
    // i.e. proportional to -l.n
    float df = max(dot(-vL, vN), 0.0);
    // Specular:
    // refl toward eye is proportional to cos(angle between eye & reflected light vectors)
    // i.e. proportional to r.e
    vec3 vE = normalize(vec3(0, 0, 4) - fragpos_world);
    vec3 vR = reflect(vL, vN);
    float sf = max(dot(vR, vE), 0.0);
    float col = uLightA + df*uLightD + sf*uLightS;
    fragOutColour = vec4(col, col, col, uObjOpacity);
}

我在这里找不到错误;谁能解释为什么镜面反射组件出现在物体的后部和面向光线的一侧?

非常感谢。

您的镜面反射贡献实际上对于正面和背面是相同的,因为 GLSL reflect对法线符号不敏感。 从这个参考:

reflect(I, N) = I - 2.0 * dot(N, I) * N

因此,翻转 N 的符号会引入两个取消的减号。 换句话说,reflect所做的是反转与N相同的轴的I分量的符号。 这并不取决于N面对的是哪种方式。

如果您想从背面删除镜面反射组件,我认为您需要明确检查您的dot(vE,vN)

尝试更改

fragpos_world = vec3(modelMtx * vec4(inVPos, 0.0)); 

fragpos_world = vec3(modelMtx * vec4(inVPos, 1.0)); 

因为 http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/#Homogeneous_coordinates

相关内容

  • 没有找到相关文章

最新更新