如何仅从片段着色器输出读取R和G分量?

时间:2019-03-04 09:17:10

标签: opengl glsl fragment-shader

我正在使用屏幕外渲染进行纹理处理,以进行简单的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,因此填充了颜色附件的前两个插槽,而其他两个则是垃圾。然后,我需要对data进行后处理,以便仅从四个float中抽取两个,而这不需要进行循环和存储。

如果它是一个值,我将使用GL_RED,如果它是三个,则我将在GL_RGB中使用glReadPixels。但是我找不到一种可以读取两个值的格式。为了方便起见,我仅使用GL_RGBA,因为从2×2中抽出2个浮点比从3中抽出似乎更自然。

还有另一种方式可以读取所有紧紧包装的vec2吗?我想到只读取RED,以某种方式说服OpenGL在每个值之后跳过四个字节,然后只将GREEN读取到同一数组中以填补空白。为此,我尝试研究有关glPixelStore的问题,但这似乎并非出于此目的。这或其他方式是否可能?

1 个答案:

答案 0 :(得分:2)

如果您只想读取图像的RG分量,请在GL_RG命令中使用glReadPixels的传输格式。

但是,除非您的图像也仅存储2个频道,否则读取速度会很慢。因此,图片的内部格式应为GL_RG32F