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:还发现法线矩阵在从顶点着色器传递之前未正确应用。
我是 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:还发现法线矩阵在从顶点着色器传递之前未正确应用。