OpenGL片段着色器不点亮场景

时间:2016-06-30 11:09:38

标签: c++ opengl fragment-shader

我在OpenGL上有点新手,而且我已经用一个环绕行星的实例小行星实现了照明。出于某种原因,我唯一得到的输出似乎是场景的环境照明。我无法通过漫反射或镜面反射来工作。

这是一个场景图像(很难看到......)ambient only

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

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

由于 乔恩

Fragment Shader:

`

#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);
}

`

1 个答案:

答案 0 :(得分:0)

似乎闪电的方向是错误的。不需要lightPos - fs_in.FragPos,而是需要fs_in.FragPos - lightPos。我将在这里提供有助于我的代码的链接,使其更加明显,也许它也会帮助其他人:https://github.com/aromanro/SolarSystem

修改

JonCain:事实证明,在从顶点着色器传递之前,法线的矩阵没有正确应用。