Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何在帧缓冲区中沿像素写入整数,然后使用写入的整数忽略深度缓冲区 我想做什么_Opengl - Fatal编程技术网

Opengl 如何在帧缓冲区中沿像素写入整数,然后使用写入的整数忽略深度缓冲区 我想做什么

Opengl 如何在帧缓冲区中沿像素写入整数,然后使用写入的整数忽略深度缓冲区 我想做什么,opengl,Opengl,我想让另一组三角形的一组三角形出血,或者忽略深度缓冲区,但前提是它们的编号相同 问题(可选阅读) 我不知道如何在不向管道中引入大量气泡的情况下做到这一点。现在我有非常高的吞吐量,因为我可以把我的几何体放到GPU上,告诉它渲染,然后忘记它。然而,如果我必须在画图时不断切换状态,我担心我的表现会下降。其他人做了我刚才所说的事情(做了大量的抽签和状态更改),他们的表现比我差得多。这种性能损失在较旧的硬件上也要严重得多,我们讨论的是,通过状态更改的方式,性能损失大约为50-100倍 不幸的是,这种三角形

我想让另一组三角形的一组三角形出血,或者忽略深度缓冲区,但前提是它们的编号相同

问题(可选阅读) 我不知道如何在不向管道中引入大量气泡的情况下做到这一点。现在我有非常高的吞吐量,因为我可以把我的几何体放到GPU上,告诉它渲染,然后忘记它。然而,如果我必须在画图时不断切换状态,我担心我的表现会下降。其他人做了我刚才所说的事情(做了大量的抽签和状态更改),他们的表现比我差得多。这种性能损失在较旧的硬件上也要严重得多,我们讨论的是,通过状态更改的方式,性能损失大约为50-100倍

不幸的是,这种三角形出血场景发生了数千次,因此状态机将被“绘制三角形,深度关闭,绘制三角形出血,深度打开,…”淹没,除了N次,其中N次可能变大(N>=1000)

想象这一点的一个好方法是有一组三角形
T\u i
,以及一组通过
B\u i
流血的三角形,其中
B\u i
只通过
T\u i
流血,而
i
的范围是
0…1000+
。请注意,如果我们正在绘制
B_100
,那么它应该只通过
T_100
,而不是
T_99
T_101

我的下一个想法是将所有三角形及其整数绘制到一个帧缓冲区(与整数一起),然后将贯穿三角形绘制到另一个帧缓冲区(也与整数一起),然后将这些帧缓冲区合并在一起。我想它们会有颜色、深度和整数,所以我希望能在片段着色器中合并它们

问题是,我不知道如何在片段着色器中的
out vec4 fragColor
旁边写一个整数

问题(简而言之) 这给我留下了两个问题:

  • 如何将整数写入帧缓冲区?我是否需要写入4个单独的纹理帧缓冲区?(就像一个颜色/深度帧缓冲区纹理,另一个整数帧缓冲区纹理,然后将其加倍,以便我可以在某个点将帧缓冲区对合并在一起?)
  • 为了更清楚地说明这一点,算法如下

  • 渲染所有“可能从三角形中流血”,如上所述,设置为T_i, 将颜色和深度信息写入FB1,将整数写入FB2

  • 渲染所有“出血”三角形,如上所述为集合B_i, 将颜色和深度写入FB3,将整数写入FB4

  • 绑定FB1、FB2、FB3、FB4的纹理

  • 通过采样RGBA、深度和整数渲染每个像素 从适当的纹理中,将其写入 最终帧缓冲区

  • 我需要从着色器中的纹理访问颜色和深度。我还需要从另一个纹理访问整数。然后,我可以进行比较并选择要写入默认帧缓冲区的像素

  • 这个想法可能吗?我假设(1)是,那么答案是肯定的。也许另一个问题是是否有更好的方法。我试图用模具缓冲区来做这件事,但没有成功

  • 你想要的理论上是可能的,但我不能谈论它的性能。对于每个程序迭代,您将在许多纹理中读取和写入大量texel

    无论如何,要回答您的问题:

  • 帧缓冲区可以使用
    glFramebufferTexture2D
    GL\u color\u ATTACHMENT0
    GL\u color\u ATTACHMENT1
    等具有多个颜色附件。然后,每个纹理都可以有自己的内部格式,在您的示例中,您可能希望为颜色输出使用常规RGB纹理,和第二个仅为1整数的纹理

  • 深度缓冲区很复杂,因为您不想让OpenGL正常处理它。如果您想接管深度缓冲区,您可能希望将其作为另一个浮动纹理附加,您可以对照屏幕空间碎片进行检查

  • 如果对着色器有疑问,请记住,可以将任意数量的纹理绑定为在代码中编程的输入采样器,并且每个颜色绑定都有自己的输出值(着色器按纹理运行,因此每次输出一个值)。确保输出的格式正确,即颜色缓冲区为
    vec3
    /
    vec4
    ,整数缓冲区为
    int
    ,浮点缓冲区为
    float

  • 而且模具缓冲区不会帮助您在单个(可能是间接的)绘制调用中打开或关闭深度检查。我无法想象你流血的事意味着什么,但它可能会有帮助吗?大概但绝对不是有条件的深度检查