gpt4 book ai didi

性能 - 在 opengl 中绘制许多 2d 圆

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

我正在尝试在 opengl 中为我的 2d 游戏绘制大量的 2d 圆圈。它们大小相同,质地相同。许多 Sprite 重叠。最快的方法是什么?

an example of the kind of effect I'm making http://img805.imageshack.us/img805/6379/circles.png

(需要注意的是,黑边只是由于圆圈的扩大爆炸,在截屏后的一瞬间就被填满了。

目前我正在使用一对带纹理的三角形来制作每个圆圈。我在纹理的边缘周围设置了透明度,以使其看起来像一个圆圈。为此使用混合被证明是非常慢的(并且 z 剔除是不可能的,因为它们被渲染为深度缓冲区的正方形)。相反,我没有使用混合,而是让我的片段着色器丢弃任何 alpha 为 0 的片段。这有效,但是这意味着早期 z 是不可能的(因为片段被丢弃)。

速度受到大量 overdraw 和 gpu 的填充率的限制。绘制圆圈的顺序并不重要(前提是它不会在帧之间发生变化而产生闪烁)所以我一直在努力确保屏幕上的每个像素只能写入一次。

我尝试使用深度缓冲区。在每帧开始时,它被清除为 1.0f。然后当绘制一个圆圈时,它会将深度缓冲区的那部分更改为 0.0f。当通常在那里绘制另一个圆时,它不是因为新圆的 z 也为 0.0f。这不小于深度缓冲区中当前存在的 0.0f,因此不会被绘制。这有效并且应该减少必须绘制的像素数量。然而;奇怪的是它并没有更快。我已经问过有关此行为的问题 (opengl depth buffer slow when points have same depth),建议是在使用相等的 z 值时不会加速 z 剔除。

相反,我必须为我的所有圈子提供从 0 开始的单独的错误 z 值。然后,当我使用 glDrawArrays 和 GL_LESS 的默认值进行渲染时,由于 z 剔除,我们正确地获得了速度提升(尽管早期 z 是不可能的,因为片段被丢弃以使圆圈成为可能)。然而,这并不理想,因为我不得不为 2d 游戏添加大量与 z 相关的代码,而这根本不需要它(如果可能的话不传递 z 值会更快)。然而,这是我目前找到的最快的方法。

最后我尝试使用模板缓冲区,我在这里使用

glStencilFunc(GL_EQUAL, 0, 1);
glStencilOp(GL_KEEP, GL_INCR, GL_INCR);

模板缓冲区每帧重置为 0。这个想法是在第一次绘制像素之后。然后在模板缓冲区中将其更改为非零。然后不应再次绘制该像素,从而减少 overdraw 量。然而,事实证明这并不比在没有模板缓冲区或深度缓冲区的情况下绘制所有内容更快。

人们找到的最快的写作方式是什么?

最佳答案

根本问题是您填充受限,即 GPU 无法在您期望的时间内对您要求它绘制的所有片段进行着色。您的深度缓冲技巧无效的原因是处理过程中最耗时的部分是对片段进行着色(通过您自己的片段着色器或通过固定功能着色引擎),这发生了 在深度测试之前。使用模板也会出现同样的问题;像素着色发生在模板之前。

有几件事可能会有所帮助,但它们取决于您的硬件:

  • 使用深度缓冲从前到后渲染您的 Sprite 。现代 GPU 通常会尝试确定一组片段是否可见,然后再将它们送去进行着色。粗略地说,检查深度缓冲区(或其表示)以查看即将被着色的片段是否可见,如果不可见,则处理在该点终止。这应该有助于减少需要写入帧缓冲区的像素数量。
  • 使用片段着色器立即检查纹素的 alpha 值,并在任何其他处理之前丢弃片段,如:

    varying vec2 texCoord;
    uniform sampler2D tex;

    void main()
    {
    vec4 texel = texture( tex, texCoord );

    if ( texel.a < 0.01 ) discard;

    // rest of your color computations
    }

(在固定功能片段处理中也可以使用alpha测试,但在片段着色完成之前是否应用测试是不可能的)。

关于性能 - 在 opengl 中绘制许多 2d 圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14962614/

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