代码之家  ›  专栏  ›  技术社区  ›  Ellipsis

当点具有相同深度时,opengl深度缓冲区速度较慢

  •  3
  • Ellipsis  · 技术社区  · 11 年前

    我正在制作一个2d游戏,在屏幕上绘制大量重叠的四边形。前面的东西并不重要。

    如果我画出每个四边形,z值从0开始向上,并设置glDepthFunc(GL_LESS),我会得到很好的速度提升,正如你所期望的那样。 这是为了避免绘制完全隐藏或部分隐藏在其他四边形后面的四边形。 所以我用这样的东西画四边形:

    float small = (float(1)/1000000);
    for (int iii = 0; iii < 100000; iii++) {
        freeSpace = bullets[iii]->draw(opengl, freeSpace, iii*small);
    }
    

    然而,由于我不使用z值来表示实际深度,所以我似乎可以继续:

    for (int iii = 0; iii < 100000; iii++) {
        freeSpace = bullets[iii]->draw(opengl, freeSpace, 0.0f);
    }
    

    或者只将0.0f的z值编码到着色器中。(第三个参数是z值,并且最终在着色器中被设置为gl_position而没有改变。)

    奇怪的是,第二种方法(每次都将z值设置为0.0f)的帧速率几乎不到前者的一半。

    为什么会这样?它们都使用glDepthFunc(GL_LESS)和

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLES, 0, 100000*(2*3));
    

    还是一样。我认为,如果每次将z设置为0.0f会更快。为什么不是?

    1 回复  |  直到 11 年前
        1
  •  3
  •   Roger Allen    11 年前

    我不是肯定的,但我的推测是,基元之间z值的小增量允许zcurl硬件工作。这将在碎片到达碎片着色器之前将其剔除。除了避免碎片着色器工作外,当碎片进入深度缓冲区测试时,这种剔除的速度可能比正常的z测试更快。