[英]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.FragPos
和fs_in.FragPos - lightPos
需要fs_in.FragPos - lightPos
。 我将在此处提供指向我的代码的链接的帮助,使其变得更加可见,也许它也会对其他人有所帮助: https : //github.com/aromanro/SolarSystem
编辑
乔恩·凯恩(JonCain):还发现法线的矩阵在从顶点着色器传递之前未正确应用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.