我正在使用C ++,当我实现漫反射着色器时,它会导致所有其他三角形消失。
如果需要,我可以发布我的渲染代码,但我相信问题在于我的普通矩阵(我把它写成模型视图矩阵的转置反转)。这是着色器代码,类似于灯塔教程教程的代码。 VERTEX SHADER
#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,我尝试了不同的导出选项,比如保持顶点顺序,但没有任何效果。
答案 0 :(得分:0)
这与你的着色器无关。
似乎与深度测试有关。在这里,相对于您的视口的深度中的三角形的顺序是混乱的,因为您不确保仅绘制到相机的最近像素。
启用深度测试并确保绑定到渲染目标的z缓冲区。 在此处详细了解:http://www.opengl.org/wiki/Depth_Test
只有红色突出显示的三角形才能对观看者可见。由于缺乏有效的深度测试,没有机会保证最顶部的三角形。因此,不应该看到的面的蓝色三角形将覆盖先前绘制的红色三角形的部分。
深度测试将通过比较z缓冲区中的深度与当前时刻要绘制的像素的深度来省略此操作。只有更接近观察者的像素的颜色信息,即具有比缓冲器中的z值小的z值,才应被写入帧缓冲器以便获得正确的结果。
(背面剔除,也会很好,如果模型正确导出,也允许正确显示。但它只会隐藏主要问题,而不是解决它。)