【问题标题】:Order of execution of depth_clamp and depth_testdepth_clamp 和 depth_test 的执行顺序
【发布时间】:2012-12-29 05:45:44
【问题描述】:

深度钳是在深度测试之前还是深度测试之后发生的? 我正在渲染坐标 > 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);

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

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

【问题讨论】:

    标签: opengl opengl-3 depth-testing


    【解决方案1】:

    从 OpenGL 4.3、17.3.6:

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


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

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

    另外,你的循环:

    vertices[3*i+2]*=25
    

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

    【讨论】:

    • 为什么它没有在屏幕上绘制任何东西?
    • 这是一个完全不同于钳位与测试顺序的问题。回答它需要的比你发布的要多得多。比如你的深度测试是什么,你使用的矩阵等等。
    • 我根本没有使用任何矩阵,只是在着色器中传递顶点数组。关于depth_test,因为我没有调用任何其他API进行深度比较,我假设默认情况下它是GL_LEQUAL。
    • @Roshan:当然,您使用的是矩阵,即使它只是单位矩阵,也可以用多种方式编写。如果您正在使用着色器,那么您必须发布着色器源代码,以便我们提出任何有价值的建议,因为没有着色器我们是盲目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2018-07-13
    • 2017-08-23
    • 2017-05-20
    • 2022-01-08
    相关资源
    最近更新 更多