【问题标题】:"Interleaved rendering" in fragment shader片段着色器中的“交错渲染”
【发布时间】:2021-12-02 02:55:32
【问题描述】:

附:是的,我在 Computer Graphics Stack Exchange 上发布了这个 question。不过发帖也是希望更多人看到

简介

我正在尝试渲染多通道图像(超过 4 个通道,以便将其馈送到神经网络)。由于 OpenGL 本身不支持它,所以我有多个 4 通道渲染缓冲区,我将相应部分的通道渲染到其中。

例如,我需要大小为512 x 512 x 16 的多通道图像,在OpenGL 中我有4 个大小为512 x 512 x 4 的渲染缓冲区。现在的问题是神经网络期望数据的步幅为512 x 512 x 16,即一个像素的 16 个通道值后跟下一个像素的 16 个通道值。然而,目前我可以通过 4 次调用 glReadPixels 有效地读取我的 4 个渲染缓冲区,基本上使数据具有跨越 4 x 512 x 512 x 4。在客户端手动重新排序数据我不够用,因为它太慢了。

主要问题

我有一个想法是渲染到一个大小为512*4 x 512 x 4 的单个 4 通道渲染缓冲区,因为在跨步方面它相当于 512 x 512 x 16,我们只需将连续 4 个像素的组合视为单个16 通道输出图像的像素。我们称之为“交错渲染”

但这需要我神奇地调整我的片段着色器,以便每组后续的 4 个片段 将具有完全相同的顶点属性插值。有什么办法吗?

这个带有1024 x 512 4 通道图像的 1 个渲染缓冲区的糟糕插图是应该如何渲染的示例。有了它,我可以在 1 次调用 glReadPixels 中大步提取数据 512 x 512 x 8

编辑:更好的图片 我现在拥有的(4 个渲染缓冲区)

我想在 OpenGL 中本地执行的操作(此图像是在 Python 中离线完成的)

【问题讨论】:

    标签: opengl opengl-es fragment-shader


    【解决方案1】:

    但这需要我神奇地调整我的片段着色器,以便每组后续的 4 个片段将具有完全相同的顶点属性插值。

    不,它需要的还不止这些。您必须从根本上改变 光栅化 的工作方式。

    以 4 倍宽度渲染就是以 4 倍宽度渲染。这意味着相对于正方形区域拉伸生成的图元。但这不是你想要的效果。您需要光栅化器以原始分辨率进行光栅化,然后复制光栅化产品。

    这是不可能的。

    来自cmets:

    我刚刚想到,我可以尝试从顶点+片段着色器获取纹理坐标的 512 x 512 x 2 图像,然后将其缝合以使其宽 4 倍(因此我们将获得相同的插值) 并由此形成最终图像

    这是个好主意。您需要将所需的任何插值值渲染到原始大小的纹理,类似于延迟渲染的工作方式。所以它可能不仅仅是2个值。您可以只存储 gl_FragCoord.xy 值,然后使用它们来计算您需要的任何值,但直接存储插值可能更容易。

    我建议在读取纹理时使用texelFetch,因为您可以指定精确的整数纹理像素坐标。您需要的整数坐标可以从gl_FragCoord 计算如下:

    ivec2 texCoords = ivec2(int(gl_FragCoord.x * 0.25f), int(gl_FragCoord.y));
    

    【讨论】:

    • 是的,您将问题编辑为512*4 x 512 x 4,但它不再等同于512 x 512 x 16。所以我想最终的图像应该高 4 倍,而不是宽 4 倍。但无论如何,有没有办法直接制作一个具有 16 个连续输出组件的计算着色器?
    • @AlexeyLarionov:那么,这 16 个元素是否不相邻?因为来自 512x2048 图像的glReadPixels 将逐行读取 512 个 4 通道值,然后是 512 个 4 通道值等。如果 4 个值的组之间的步幅为 512,那么这将起作用,但您似乎表明它们之间没有步幅。这 16 个值对于特定像素是连续的。
    • 那么您可能对 2048x512 是正确的,我可能会混淆行/列主要读取。
    • 我突然想到,我可以尝试从顶点+片段着色器获取纹理坐标的512 x 512 x 2 图像,然后将其与自身缝合以使其宽 4 倍(因此我们将得到相同的插值)并由此形成最终图像
    • @AlexeyLarionov:我为这个想法添加了一些细节。
    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2013-07-24
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多