我正在用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);
}所以,基本上,我将物体渲染到相机的距离,以直观地显示出问题所在。我使用了不同的模型,不同文件格式的程序网格和预先生成的网格,结果总是这样。
不知道这是否重要,但我使用的VAO有一个顶点缓冲区和3个属性(位置,法线,uv)。
我已经启用了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);我是不是做错了什么?
发布于 2014-07-31 02:45:27
通过更改来尝试一下
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。
https://stackoverflow.com/questions/25041034
复制相似问题