我正在用C ++ / OpenGL编写一个小型图形引擎,并设法加载模型并在屏幕上渲染它。但是,网格的某些部分似乎是倒置的,就像法线面向错误的方向一样:
我用于截图的着色器看起来像这样(只有片段着色器,顶点着色器应该没问题):
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);
我在这里做错了吗?
答案 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的原因。