在我的小型3D渲染器中,点灯只照亮了半个场景。我尝试过的每一个场景(会议室、康奈尔盒子等)都会发生这种情况。
我如何调试它呢?有什么不对的?

这是着色器。我没有做任何不寻常的事。光定位在(0,1.0,0)的世界空间。
//
// VERT SHADER
//
#version 410 core
uniform mat4 M;
uniform mat4 V;
uniform mat4 P;
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec3 color;
layout (location = 3) in vec2 texCoords;
out vec3 fWorldPos;
out vec3 fNormal;
out vec3 fColor;
out vec2 fTexCoords;
void main()
{
mat4 normalMatrix = transpose(inverse(M));
fWorldPos = vec3(M * vec4(position, 1.0));
fNormal = normal; // also tested multiplying with normal, M, and MV matrices
fColor = color;
fTexCoords = texCoords;
gl_Position = P * V * M * vec4(position, 1);
}
//
// FRAG SHADER
//
#version 410 core
#define MAX_POINT_LIGHTS 4
struct PointLight {
float strength;
vec3 position;
vec3 color;
vec3 attenuation;
};
struct Material {
vec3 color;
};
uniform Material material;
uniform int totalPointLights;
uniform PointLight pointLights[MAX_POINT_LIGHTS];
uniform vec3 cameraPosition;
in vec3 fWorldPos;
in vec3 fNormal;
in vec3 fColor;
in vec2 fTexCoords;
out vec4 color;
float attenuate(float dist, const PointLight light) {
return light.strength / (light.attenuation.x + light.attenuation.y * dist + light.attenuation.z * dist * dist);
}
//
// MAIN
//
void main()
{
vec3 normal = normalize(fNormal);
PointLight light = pointLights[0];
vec3 lightDir = light.position - fWorldPos;
float lightDst = length(lightDir);
lightDir = lightDir / lightDst;
float att = attenuate(lightDst, light);
float diffuseFactor = max(dot(normal, lightDir), 0.0);
color = vec4(material.color * diffuseFactor * att, 1);
}
```发布于 2020-01-22 08:46:36
正常值确实是错误的。这是很疯狂的,因为我甚至在Blender登记过他们是正确的(而且他们是正确的)。结果,当加载网格时,我是作为颜色传递正常的,反之亦然。瓦莱汀的正常可视化着色是伟大的(https://vallentin.dev/2015/02/16/visualizing-normals)。
谢谢你的帮忙!

https://computergraphics.stackexchange.com/questions/9505
复制相似问题