glDepthRange是如何工作的?

5

我的顶点坐标是:

GLfloat vertices[]=
    {
        0.5f,0.5f,0.5f,                                   
        -0.5f,0.5f,0.5f,
        -0.5f,-0.5f,0.5f,
        0.5f,-0.5f,0.5f,//face 1

        0.5f,-0.5f,-0.5f,
        -0.5f,-0.5f,-0.5f,
        -0.5f,0.5f,-0.5f,
        0.5f,0.5f,-0.5f,//face 2

        0.5f,0.5f,0.5f,
        0.5f,-0.5f,0.5f,
        0.5f,-0.5f,-0.5f,
        0.5f,0.5f,-0.5f,//face 3                

        -0.5f,0.5f,0.5f,
        -0.5f,0.5f,-0.5f,
        -0.5f,-0.5f,-0.5f,
        -0.5f,-0.5f,0.5f,//face 4

        0.5f,0.5f,0.5f,
        0.5f,0.5f,-0.5f,
        -0.5f,0.5f,-0.5f,
        -0.5f,0.5f,0.5f,//face 5

        -0.5f,-0.5f,0.5f,
        -0.5f,-0.5f,-0.5f,
        0.5f,-0.5f,-0.5f,
        0.5f,-0.5f,0.5f//face 6     

    };

现在,我正在通过以下方式更改z坐标:

for(int i=0;i<24;i++)
    vertices[i*3+2]*=10
glDepthRange(0,10.0);

现在,由于glDepthRange调用,我希望z坐标将被映射到-0.5到0.5的范围内,并且我能够看到一个合适的立方体,但实际输出却与我注释掉上面的glDepthRange调用时出现扭曲几何图形的输出相同。
1个回答

6
让我引用一下man手册:
剪裁和除以w后,深度坐标的范围从-1到1,对应于近和远裁剪平面。glDepthRange指定了在此范围内的规范化深度坐标的线性映射到窗口深度坐标。无论实际的深度缓冲区实现如何,窗口坐标深度值都被视为从0到1(像颜色分量一样)。因此,在接受这些值之前,glDepthRange接受的值都被夹紧到此范围内。
换句话说,您实际上不能使用大于1的深度值;您必须自己正确计算它们。它基本上归结为在投影矩阵中设置适当的near和far值,并在模型视图矩阵中转换Z坐标,以使所有最终的Z值介于前述值之间。
如果需要更详细的解释,请留下评论。

谢谢您的回复。我已经了解了您关于矩阵的解释。但是我仍然不明白“glDepthRange指定了将此范围内的归一化深度坐标线性映射到窗口深度坐标”的含义是什么?您能否给出一个小例子来展示glDepthRange的工作原理。 - debonair
这是一种复杂的说法,即您的压缩范围(由glDepthRange设置)被拉伸到(0,1) :)(再次查看手册 - *窗口深度值始终被视为(0,1)*)。我猜你可能会觉得它没什么用,但实际上你不应该担心它。 - Bartek Banachewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接