繁体   English   中英

片段着色器中的“交错渲染”

[英]"Interleaved rendering" in fragment shader

PS 是的,我在 Computer Graphics Stack Exchange 上发布了这个问题 但是发帖也是希望更多人看到

介绍

我正在尝试渲染多通道图像(超过 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 个片段将具有完全相同的顶点属性插值。 有没有办法做到这一点?

这个带有 1 个1024 x 512 4 通道图像渲染缓冲区的糟糕插图是它应该如何渲染的一个例子。 这样我就可以在 1 次调用glReadPixels512 x 512 x 8步幅提取数据在此处输入图片说明

编辑:更好的图片我现在拥有的(4 个渲染缓冲区) 在此处输入图片说明

我想在 OpenGL 中本地做的事情(此图像是在 Python 离线中完成的) 在此处输入图片说明

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

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

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

那是不可能的。

来自评论:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM