opengl - 如何仅从片段着色器输出中读取 R 和 G 组件?
问题描述
我正在使用屏幕外渲染来纹理进行简单的 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
,每四个 s 中只取出两个float
,这需要不必要的循环和存储。
如果是一个值,我会使用GL_RED
,如果是三个,我会GL_RGB
在我的glReadPixels
. 但是我找不到可以读取两个值的格式。我只是GL_RGBA
为了方便而使用,因为从 2×2 中取出 2 个浮点数似乎比从 3 个浮点数中取出更自然。
是否有另一种方法可以读取所有vec2
紧密包装的结果?我想只读取 RED,以某种方式说服 OpenGL 在每个值之后跳过四个字节,然后仅将 GREEN 读取到同一个数组中以填补空白。为此我试图研究一下glPixelStore
,但似乎不是为了这个目的。这是可能的,或者任何其他方式,甚至可能吗?
解决方案
如果您只想读取图像的 RG 组件,请GL_RG
在glReadPixels
命令中使用传输格式 。
但是,除非您的图像也只存储 2 个通道,否则读取速度会很慢。所以你的图像的内部格式应该是GL_RG32F
.
推荐阅读
- python - Python:如何展平每个子列表是一个包含单个浮点数的列表列表
- node.js - CouchDB 数据库创建/删除
- excel - 缺失值循环的会计处理
- selenium - mvn clean install 在更新 .m2 存储库之前是否运行肯定测试
- dependency-injection - MassTransit v6 使用发送过滤器
- java - 匹配不同卡片的正则表达式模式
- mysql - mysqldump 和 python 子进程 wait() 不工作
- json - 在 XSLT 中获取整数值
- c++ - C ++:使用方法调用析构函数的顺序是什么?
- javascript - 用不同的对象替换数组中的每个字符串?