(4)glClearDepth()

opengl里面的深度缓存 
在现实生活中,一个实心物体挡在另外一个实心物体的前面, 后面的那个物体有部分会被遮盖掉
那么opengl里面如何模拟这个情况呢? 每个物体的每个像素都有一个深度缓存的值(在0到1之间,可以想象成是z轴的距离)
如果glDepthFunc启用了GL_LESS(现实生活中的前景), 那么当前个物体挡住后个物体时, 由于前个物体深度值小(越靠近人的), 所以它就被画了出来, 后面的物体被挡住的像素就被忽略掉了。(当然你如果启用了GL_GREATER, 那么情况就反过来了)

这个时候再来说glClearDepth, 它给深度缓冲指定了一个初始值,缓冲中的每个像素的深度值都是这个, 比如1,这个时候你往里面画一个物体, 由于物体的每个像素的深度值都小于等于1, 所以整个物体都被显示了出来。 如果初始值指定为0, 物体的每个像素的深度值都大于等于0, 所以整个物体都不可见。 如果初始值指定为0.5, 那么物体就只有深度小于0.5的那部分才是可见的


glClearDepth(1.0);            // 1.0是最大深度([0.0,1.0])
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);    // 最好在display()中调用

 glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_TRIANGLES);
    for(int i=0; i<3; i++) {
        int offset = i*3;
        glVertex3f(vertexArr1[offset], vertexArr1[offset+1], vertexArr1[offset+2]);
    }
    glEnd();

    glColor3f(0.0, 1.0, 0.0);
    glBegin(GL_TRIANGLES);
    for(int i=3; i<6; i++) {
        int offset = i*3;
        glVertex3f(vertexArr1[offset], vertexArr1[offset+1], vertexArr1[offset+2]);
    }
    glEnd();

     如果不使用glEnable(GL_DEPTH_TEST),则绘制的结果是绿色三角形在红色三角形之上;

这同时说明了openGL的绘制顺序与代码中的出现顺序相反。


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ysu341341/article/details/52370407
上一篇(3)glClear()+glClearColor()
下一篇(5)gluLookAt、glViewport()、glOrtho和gluPerspective参数分析
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭