OpenGL-输出白色的点光源着色器

OpenGL-输出白色的点光源着色器,opengl,glsl,shader,normals,Opengl,Glsl,Shader,Normals,在我的逐顶点点光源实现中,每个片段输出都是白色的,我很难找到问题的根源 我密切关注着色器代码的教程,所以我认为问题可能源于我的顶点法线 场景由平面(每个平面有2个三角形)组成。每个平面的法线是基于它的四个角,它是我传递给每个顶点的着色器的法线向量。正常方向如下所示 然而,经过大量研究,这似乎是计算法线的正确方法。如有任何建议,将不胜感激 顶点着色器 #version 330 uniform mat4 projectionMatrix; uniform mat4 modelViewMatr

在我的逐顶点点光源实现中,每个片段输出都是白色的,我很难找到问题的根源

我密切关注着色器代码的教程,所以我认为问题可能源于我的顶点法线

场景由平面(每个平面有2个三角形)组成。每个平面的法线是基于它的四个角,它是我传递给每个顶点的着色器的法线向量。正常方向如下所示

然而,经过大量研究,这似乎是计算法线的正确方法。如有任何建议,将不胜感激

顶点着色器

#version 330

uniform mat4 projectionMatrix; 
uniform mat4 modelViewMatrix; 

in vec3 in_position;
in vec2 in_texcoords;
in vec3 in_normals;

out vec3 vPosition;
out vec2 vTextureCoord;
out vec3 vNormal;

void main(void)
{
    vPosition = vec3(modelViewMatrix * vec4(in_position, 1.0));
    vTextureCoord = in_texcoords;
    vNormal = vec3(modelViewMatrix * vec4(in_normals, 0.0));

    gl_Position = projectionMatrix * modelViewMatrix * vec4(in_position, 1.0);
}
片段着色器

#version 330

precision mediump float;

in vec3 vPosition;
in vec2 vTextureCoord;
in vec3 vNormal;

out vec4 finalColor;

uniform sampler2D MyTexture0;

void main(void)
{
    vec3 lightPosition = vec3(8.2, 0, 3);

    float distance = length(lightPosition - vPosition);
    vec3 lightVector = normalize(lightPosition - vPosition);
    float diffuse = max(dot(vNormal, lightVector), 0.1);
    diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));

    vec4 fragmentColor = texture(MyTexture0, vec2(vTextureCoord.s, vTextureCoord.t));

    finalColor = fragmentColor * diffuse;
}
使用基本着色器显示的场景,不进行照明计算


如果禁用照明,网格是否仍为白色?是否确定法线已规格化?禁用照明后,网格将正确渲染,并且法线在发送到着色器之前均规格化为1的长度。有什么想法吗?如果我是你,我会尝试将规范化强制到片段着色器中:float diffuse=max(点(normalize(vNormal),lightVector,0.0);在顶点着色器中没有使用良好的法线变换。法线矩阵应该是modelview矩阵的逆矩阵的转置。所以我会这样做:vNormal=转置(逆矩阵(mat3(modelViewMatrix)))*在_normals.xyz;但是,我建议您更喜欢延迟照明,而不是使用几何体执行照明。当片段着色器无效时,白色通常是OpenGL制作的东西(尽管我认为顶点着色器也会这样做)。它编译了吗?程序链接正确吗?