Performance 当点具有相同深度时,opengl深度缓冲区会变慢

Performance 当点具有相同深度时,opengl深度缓冲区会变慢,performance,opengl,gpu,depth,depth-buffer,Performance,Opengl,Gpu,Depth,Depth Buffer,我正在做一个2d游戏,包括在屏幕上画大量重叠的四边形。放在前面的东西其实并不重要 如果我用z值从0向上绘制每个四边形,并设置glDepthFunc(GL_LESS),我会像你所期望的那样获得相当好的速度提升。 这是为了避免绘制完全隐藏或部分隐藏在其他四边形后面的四边形。 因此,我使用如下方式绘制四边形: float small = (float(1)/1000000); for (int iii = 0; iii < 100000; iii++) { freeSpace = bul

我正在做一个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设置为0.0f,速度会更快。为什么不呢?

我不是肯定的,但我的猜测是,原语之间z值的小增量允许zcull硬件工作。这将在片段到达片段着色器之前剔除片段。除了避免碎片着色器工作之外,当碎片进入深度缓冲区测试时,这种剔除可以比正常的z测试更快地发生

深度缓冲区的清除值是多少?否,但它小于1(深度缓冲区的清除值)。因此,每个像素只被写入一次。我可以使用GL_-LEQUAL,但它的性能仍然很差(数量与GL_-LEQUAL相同)。我的目标是尝试让深度缓冲区只允许每个像素绘制一次,以降低填充率要求。深度缓冲区清除为默认值(我从不更改它)。所以我相信它会清晰到1.0f。啊,谢谢。听起来有可能。我将在片段着色器中丢弃,因此我认为早期zcull是不可能的。然而,正常的淘汰可能会发生。奇怪的是,当这些点具有和z值时,它不会发生?我怎样才能解决这个问题?我目前的方法似乎很复杂。我应该使用模具缓冲区,还是让顶点着色器以某种方式生成z值?无论如何,谢谢你的回复。哦,是的,如果你在片段着色器中删除片段,那么zcull硬件就不能使用,这也会影响其他z测试性能的改进。如果你可以避免使用片段着色器kill,你可能会发现一个显著的性能改进。我必须在屏幕上画圆圈,因为这似乎是不可避免的。我在四元体和以太体上绘制带纹理的圆,我必须打开混合,这会导致减速或丢弃碎片着色器中alpha值为0的所有像素。还有别的(更好的)办法吗?我认为即使我在片段着色器中丢弃了某些zculling,但它仍然在进行,这是对的吗?我认为基本答案是——它很复杂,所以没有简单的答案。您正在探索不同芯片将以不同方式加速和优化的管道部分。听起来您对图形管道中应该发生的事情有了很好的了解。我建议你尝试一下你的想法,探索一下设计空间,看看你的名片上什么最合适。
for (int iii = 0; iii < 100000; iii++) {
    freeSpace = bullets[iii]->draw(opengl, freeSpace, 0.0f);
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 100000*(2*3));