我在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);
}
`
答案 0 :(得分:0)
lightPos - fs_in.FragPos
,而是需要fs_in.FragPos - lightPos
。我将在这里提供有助于我的代码的链接,使其更加明显,也许它也会帮助其他人:https://github.com/aromanro/SolarSystem
修改
JonCain:事实证明,在从顶点着色器传递之前,法线的矩阵没有正确应用。