【发布时间】:2014-05-30 14:27:06
【问题描述】:
我使用的是 C++,当我实现漫反射着色器时,它会导致其他所有三角形消失。
如果需要,我可以发布我的渲染代码,但我认为问题在于我的普通矩阵(我将其写为模型视图矩阵的转置逆矩阵)。这是一个类似于灯塔教程的着色器代码。 顶点着色器
#version 330
layout(location=0) in vec3 position;
layout(location=1) in vec3 normal;
uniform mat4 transform_matrix;
uniform mat4 view_model_matrix;
uniform mat4 normal_matrix;
uniform vec3 light_pos;
out vec3 light_intensity;
void main()
{
vec3 tnorm = normalize(normal_matrix * vec4(normal, 1.0)).xyz;
vec4 eye_coords = transform_matrix * vec4(position, 1.0);
vec3 s = normalize(vec3(light_pos - eye_coords.xyz)).xyz;
vec3 light_set_intensity = vec3(1.0, 1.0, 1.0);
vec3 diffuse_color = vec3(0.5, 0.5, 0.5);
light_intensity = light_set_intensity * diffuse_color * max(dot(s, tnorm), 0.0);
gl_Position = transform_matrix * vec4(position, 1.0);
}
我的片段着色器只是以颜色的形式输出“light_intensity”。我的模型直接来自 Blender,我尝试了不同的导出选项,例如保持顶点顺序,但没有任何效果。
【问题讨论】:
-
尝试更改其中一个三角形中顶点的顺序。好像是个绕线的问题
-
你指的是换模型吗?
-
是的,你的脸似乎不遵循同样的曲折,试着用你的顶点顺序玩一下
-
我认为问题不在于您的普通矩阵。如果那是错误的,你所有的三角形都会得到错误的照明,其中一半是正确的。我怀疑问题在于法线指向错误的方向。这类似于@HarrisonG16 建议的缠绕问题。但是如果缠绕错误,并且您启用了背面剔除,则根本不会绘制三角形。它们在这里显示为黑色,因此不会被淘汰。您的建模软件有什么方法可以显示法线吗?它们都应该指向外面。
-
以@RetoKoradi 所说的为基础,我编写了一个着色器来输出 r、g 和 b 通道中法线的 x、y 和 z。我发现这是仔细检查法线的好方法。