如何只从片段着色器输出中读取 R 和 G 分量?
How to only read R and G components from the fragment shader output?
我正在使用离屏渲染纹理进行简单的 GPU 计算。我正在使用
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, texSize, texSize, 0, GL_RGBA, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
为纹理分配存储和
glReadPixels(0, 0, texSize, texSize, GL_RGBA, GL_FLOAT, data);
读出计算的数据。问题是我感兴趣的片段着色器的输出只有 vec2
,所以颜色附件的前两个插槽被填充,另外两个是垃圾。然后我需要 post-process data
每四个 float
中只取出两个,这需要不必要的周期和存储。
如果它是一个值,我会使用 GL_RED
,如果它是三个,我会在我的 glReadPixels
中使用 GL_RGB
。但是我找不到可以读取两个值的格式。我使用 GL_RGBA
只是为了方便,因为从 2×2 中取出 2 个浮点数似乎比从 3 个中取出更自然。
是否有另一种方法可以读取所有结果 vec2
紧密打包?我想到只读取 RED,以某种方式说服 OpenGL 在每个值后跳过四个字节,然后只将 GREEN 读取到同一个数组中以填补空白。为此我尝试研究了一下glPixelStore
但是好像不是这个目的。这或任何其他方式甚至可能吗?
如果您只想读取图像的 RG 组件,请在 glReadPixels
命令中使用 GL_RG
的传输格式。
但是,读取速度会很慢除非您的图像也只存储 2 个通道。所以你的图像的内部格式应该是 GL_RG32F
.
我正在使用离屏渲染纹理进行简单的 GPU 计算。我正在使用
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, texSize, texSize, 0, GL_RGBA, GL_FLOAT, nullptr);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
为纹理分配存储和
glReadPixels(0, 0, texSize, texSize, GL_RGBA, GL_FLOAT, data);
读出计算的数据。问题是我感兴趣的片段着色器的输出只有 vec2
,所以颜色附件的前两个插槽被填充,另外两个是垃圾。然后我需要 post-process data
每四个 float
中只取出两个,这需要不必要的周期和存储。
如果它是一个值,我会使用 GL_RED
,如果它是三个,我会在我的 glReadPixels
中使用 GL_RGB
。但是我找不到可以读取两个值的格式。我使用 GL_RGBA
只是为了方便,因为从 2×2 中取出 2 个浮点数似乎比从 3 个中取出更自然。
是否有另一种方法可以读取所有结果 vec2
紧密打包?我想到只读取 RED,以某种方式说服 OpenGL 在每个值后跳过四个字节,然后只将 GREEN 读取到同一个数组中以填补空白。为此我尝试研究了一下glPixelStore
但是好像不是这个目的。这或任何其他方式甚至可能吗?
如果您只想读取图像的 RG 组件,请在 glReadPixels
命令中使用 GL_RG
的传输格式。
但是,读取速度会很慢除非您的图像也只存储 2 个通道。所以你的图像的内部格式应该是 GL_RG32F
.