1

深度钳是在深度测试之前还是深度测试之后发生的?我正在渲染一个坐标 > 1.0 和 <-1.0 的基元,并使用深度钳位和深度测试。但是当我启用深度测试时,它不会渲染任何几何图形。

这是我的代码:

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,

0.5f,-0.5f,-0.5f,
-0.5f,-0.5f,-0.5f,
-0.5f,0.5f,-0.5f,
0.5f,0.5f,-0.5f  
}

for(int i=0;i<24;i++)
    vertices[3*i+2]*=25;

    glEnable(GL_DEPTH_CLAMP);

        // when i comment stmt below, it draws triangle strips
        glEnable(GL_DEPTH_TEST); 
        glClearDepth(15.0f);
        glClearColor (1.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
        glDrawArrays(GL_TRIANGLE_STRIP,0,6);

如何同时使用深度测试和夹紧?

为什么上面的代码在启用深度测试的情况下没有在屏幕上绘制任何东西?

4

1 回答 1

4

从 OpenGL 4.3、17.3.6 开始:

如果启用了深度钳制(参见第 13.5 节),在比较传入片段的 z w之前,z w被钳制在 [min(n; f ); 范围内。最大值(n; f)]


我假设默认情况下它是 GL_LEQUAL。

这就是为什么当您不知道发生了什么时,您应该发布完整的工作示例。默认深度测试是GL_LESS. 1.0 不小于 1.0,因此所有0.5深度顶点都未通过深度测试。

另外,你的循环:

vertices[3*i+2]*=25

这是覆盖内存。您的索引远离数组的末尾,因为它只有 24 个元素。您可能打算循环 8。

于 2013-01-15T06:57:24.917 回答