OpenGL 片段着色器不照亮场景

OpenGL fragment shader not lighting the scene

我是 OpenGL 的新手,我已经为实例化的小行星环绕行星的场景实现了照明。出于某种原因,我得到的唯一输出似乎是场景的环境照明。我无法使用漫反射或镜面反射。

这是现场图片(很难看清...)ambient only

片段着色器代码如下。 FragPos、Normal 和 TexCoords 如您所料。 texture_diffuse1 是 planet/asteroid 纹理,具体取决于所使用的着色器。 LightPos 可以移动,它由图像中较小的行星表示(因此在中心行星的正上方),viewPos 是相机位置。

需要任何更多信息请告诉我,但其余代码非常简单(顶点着色器非常标准,assimp 加载场景中绘制的模型,小行星实例化 200,000 次)。

谢谢 乔恩

片段着色器:

`

#version 330 core
out vec4 fragColor;

in VS_OUT{
    vec3 FragPos;
    vec3 Normal;
    vec2 TexCoords;
} fs_in;

uniform sampler2D texture_diffuse1;
uniform vec3 lightPos;
uniform vec3 viewPos;

void main()
{
    vec3 color = texture(texture_diffuse1, fs_in.TexCoords).rgb;

    //Ambient
    vec3 ambient = 0.05f * color;

    //Diffuse
    vec3 lightDir = normalize(lightPos - fs_in.FragPos);
    vec3 normal = normalize(fs_in.Normal);
    float diff = max(dot(lightDir, normal), 0.0);
    vec3 diffuse = diff * color;

    //Specular

    vec3 viewDir = normalize(viewPos - fs_in.FragPos);  

    float spec = 0.0f;
    vec3 halfwayDir = normalize(lightDir + viewDir);
    spec = pow(max(dot(normal, halfwayDir), 0.0), 32.0f);

    vec3 specular = vec3(0.3f) * spec * color;

    float distance = length(lightPos - fs_in.FragPos);
    float attenuation = 1.0f/distance;

    //fragColor = vec4(ambient + (diffuse + specular), 1.0f);
    fragColor = vec4( pow(ambient + attenuation * (diffuse + specular),vec3(1.0f/2.2f)), 1.0f);
}

`

看来闪电的方向不对。需要的不是 lightPos - fs_in.FragPos,而是 fs_in.FragPos - lightPos。我将在此处对我的代码提供 link 帮助,使其更加可见,也许它也会帮助其他人:https://github.com/aromanro/SolarSystem

编辑

JonCain:还发现法线矩阵在从顶点着色器传递之前未正确应用。