OpenGL缺少三角形漫反射着色器

时间:2014-04-16 01:02:55

标签: c++ opengl sdl blender

我正在使用C ++,当我实现漫反射着色器时,它会导致所有其他三角形消失。 Cube OBJ

Torus OBJ

如果需要,我可以发布我的渲染代码,但我相信问题在于我的普通矩阵(我把它写成模型视图矩阵的转置反转)。这是着色器代码,类似于灯塔教程教程的代码。 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,我尝试了不同的导出选项,比如保持顶点顺序,但没有任何效果。

1 个答案:

答案 0 :(得分:0)

这与你的着色器无关。

似乎与深度测试有关。在这里,相对于您的视口的深度中的三角形的顺序是混乱的,因为您不确保仅绘制到相机的最近像素。

启用深度测试并确保绑定到渲染目标的z缓冲区。 在此处详细了解:http://www.opengl.org/wiki/Depth_Test

Triangles of the cube with wrong depth test.

只有红色突出显示的三角形才能对观看者可见。由于缺乏有效的深度测试,没有机会保证最顶部的三角形。因此,不应该看到的面的蓝色三角形将覆盖先前绘制的红色三角形的部分。

深度测试将通过比较z缓冲区中的深度与当前时刻要绘制的像素的深度来省略此操作。只有更接近观察者的像素的颜色信息,即具有比缓冲器中的z值小的z值,才应被写入帧缓冲器以便获得正确的结果。

(背面剔除,也会很好,如果模型正确导出,也允许正确显示。但它只会隐藏主要问题,而不是解决它。)