繁体   English   中英

OpenGL片段着色器无法照亮场景

[英]OpenGL fragment shader not lighting the scene

我是OpenGL的新手,并且使用实例化的小行星环绕行星为场景实现了照明。 由于某种原因,我得到的唯一输出似乎是场景的环境照明。 我无法漫无目的地工作。

这是场景的图像,因为它(很难看...) 仅在环境中

片段着色器代码如下。 FragPos,Normal和TexCoords符合您的期望。 texture_diffuse1是行星/小行星纹理,具体取决于所使用的着色器。 可以移动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.FragPosfs_in.FragPos - lightPos需要fs_in.FragPos - lightPos 我将在此处提供指向我的代码的链接的帮助,使其变得更加可见,也许它也会对其他人有所帮助: https : //github.com/aromanro/SolarSystem

编辑

乔恩·凯恩(JonCain):还发现法线的矩阵在从顶点着色器传递之前未正确应用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM