GLSL无视深度测试

时间:2014-07-30 15:37:40

标签: opengl glsl depth

我正在用C ++ / OpenGL编写一个小型图形引擎,并设法加载模型并在屏幕上渲染它。但是,网格的某些部分似乎是倒置的,就像法线面向错误的方向一样:

[Screenshot 1](http://www.directupload.net/file/d/3699/nnmhbxy2_png.htm) [Screenshot 2](http://www.directupload.net/file/d/3699/qirjviua_png.htm)

我用于截图的着色器看起来像这样(只有片段着色器,顶点着色器应该没问题):

uniform float t;
uniform sampler2D tex;

varying vec2 v_texCoords;
varying vec3 v_normal;

void main()
{
   float zbuffer = gl_FragCoord.w * 10;
   gl_FragColor = vec4(zbuffer, zbuffer, zbuffer, 1.0);
}

所以,基本上,我正在渲染物体与相机的距离,以显示出错的地方。我使用了不同的模型,程序以及不同文件格式的预生成网格,它总是看起来像那样。

不知道这是否重要,但我正在使用带有一个顶点缓冲区和3个属性(位置,正常,紫外线)的VAO。

我已启用GL_DEPTH_TEST,我的初始化例程如下所示:

/* Enable smooth shading */
glShadeModel( GL_SMOOTH);

/* Set the background black */
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

/* Depth buffer setup */
glClearDepth(1.0f);

/* Enables Depth Testing */
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

/* The Type Of Depth Test To Do */
glDepthFunc( GL_LEQUAL );

/* Really Nice Perspective Calculations */
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

尝试更改

float zbuffer = gl_FragCoord.w * 10;

float zbuffer = (gl_FragCoord.z + 1)*0.5;

z深度值在NDC空间中的gl_FragCoord的Z分量中指定,其在[-1,1]中。然后我们需要将其重新映射到[0,1]间隔。这就是我们在这里需要+1和* 0.5的原因。