目前我正在我在Blender中创建的3D场景中设置一些灯光,并通过assimp加载以下选项:
aiProcess_GenSmoothNormals | aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_FlipUVs
目前我的计划中遇到了一个非常奇怪的故障。我正在片段着色器上实现 Phong着色,以便使用以下属性进行照明:
但是,管道对象是不同的:漫反射颜色始终位于应该点亮的管道的另一侧,而镜面反射光则位于正确的一侧。这使事情变得奇怪,因为镜面反射光正在按预期工作,而漫反射组件总是在错误的一侧。当我将cilinder对象缩放到混合器中的某个点以外时,我注意到了这种效果(较小的缩放的cilinders仍然可以正常工作),因此缩放超过某个阈值的cilinder对象可能与它有关。
我的场景,管状物体有镜面反射成分,但漫反射颜色位于光源的另一侧。
在搅拌机中看到的法线
我的第一个猜测是它与正常缩放有关,但是我已经在顶点着色器中使用了普通矩阵,而我场景中的其他对象工作得很好。
顶点着色器:
#version 330
layout (location = 0) in vec3 vertex;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec3 tangent;
layout(location = 3) in vec3 color;
layout(location = 4) in vec2 texCoord;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform vec3 lightPos;
out vec3 Position;
out vec3 Normal;
out vec3 LightPos;
out vec2 TexCoord;
void main()
{
gl_Position = projection * view * model * vec4(vertex, 1.0);
// Position
Position = vec3(view * model * vec4(vertex, 1.0));
// Normal
mat3 normalMat = transpose(inverse(mat3(view * model)));
Normal = normalMat * normal;
// Lighting
LightPos = vec3(view * vec4(lightPos, 1.0));
// Texture
TexCoord = texCoord;
}
Fragment Shader:
#version 330
in vec3 Position;
in vec3 Normal;
in vec3 LightPos;
in vec2 TexCoord;
uniform sampler2D texture0;
out vec4 outColor;
void main()
{
// defaults
vec4 ambient = vec4(0.2);
vec4 diffuse = vec4(0.4);
vec4 specular = vec4(0.5);
vec4 texColor = texture(texture0, TexCoord);
// Phong shading
vec3 LightDir = normalize(LightPos - Position);
vec3 Norm = normalize(Normal);
vec3 ViewDir = normalize(-Position);
vec3 ReflectDir = reflect(-LightDir,Norm);
float specularContribution = pow(max(dot(ViewDir, ReflectDir), 0.0), 32);
// Calculate diffuse component
vec4 I = diffuse * max(dot(Norm, LightDir), 0.0);
diffuse = clamp(I, 0.0, 1.0);
// Calculate specular component
specular = specular * specularContribution;
outColor = texColor * (diffuse + ambient + specular);
}
<小时/> 的修改
我添加了一个几何着色器,在第二个绘图过程中显示所有顶点法线以进行调试。但是,当显示法线时,它们会随着相机移动而略微移动,这是他们不应该做的。我猜这可能是我之前提到的问题的原因。
我制作了一个小视频来说明正常的动作:Youtube video that displays the normal movement issues.
视频显示粉红色法线在相机移动时改变方向。情况应该不是这样,我不知道为什么。它是不正确的正常矩阵还是assimp错误地加载法线?