gpt4 book ai didi

performance - 当点具有相同的深度时,opengl 深度缓冲区变慢

转载 作者:行者123 更新时间:2023-12-02 00:11:42 24 4
gpt4 key购买 nike

我正在制作一个 2d 游戏,涉及在屏幕上绘制大量重叠的四边形。在什么之前发生什么并不重要。

如果我用 0 向上的 z 值绘制每个四边形并设置 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 会更快。为什么不是?

最佳答案

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

关于performance - 当点具有相同的深度时,opengl 深度缓冲区变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14949375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com