我正在尝试利用 gpu 的并行性来制作图像处理应用程序。我有一个着色器,它采用两个纹理,并基于一些统一变量计算输出纹理。但是每个纹理像素需要一个额外的元数据字节而不是透明度 alpha 值,这在计算中是强制性的:
所以我考虑每帧运行着色器两次,一次将动态元数据计算为单字节纹理,一次计算生成的 Paint Texture,我需要 3 个字节(以限制内存使用,因为可能一次加载很多这样的纹理)。
我觉得上面的问题有点复杂,我是用opengl画的 屏幕,但这次我需要绘制两种不同的纹理, 我不知道该怎么做。此外,gl_FragColor 内置变量的 类型是 vec4,但我需要不同的输出值。
- 所以,总结一下,片段着色器是否可以输出 除了 vec4 之外还有什么?
- 是否可以通过一次调用保存到两个不同的纹理?
- 是否可以制作一个可编辑的纹理来存储更改,直到编辑结束并且必须将数据传回 cpu?
- 哪些 openGL 调用对上述内容最有用?
- 油漆纹理也应该能够被检索以显示在屏幕上。
以上可以很容易地通过在 CPU 上传输纹理来完成。 我可以将所有相关数据保存在 cpu 上,以每秒 60 次的速度完成所有工作, 并通过将数据从 cpu 传递到 gpu 来更新相关纹理。 用于每帧更改纹理的相对较小区域 (约 512x512 大小纹理总比例的约 20%),您认为上述方法值得麻烦吗?
最佳答案
这取决于您使用的 OpenGL 版本。
最新的 OpenGL 4+ 没有 gl_FragColor
变量,而是允许您从片段着色器写入任意数量(最多支持的最大值)的输出颜色,每个颜色发送到相应的帧缓冲区颜色附件:
layout(location = 0) out vec4 OUT0;
layout(location = 1) out float OUT1;
这会将 OUT0
写入当前绑定(bind)的帧缓冲区的 GL_COLOR_ATTACHMENT0
并将 OUT1
写入 GL_COLOR_ATTACHEMENT1
。
但是,考虑到您使用 gl_FragColor
,您使用了一些旧版本的 OpenGL。我不精通旧版 OpenGL,但您可以检查您的实现是否支持 GL_ARB_draw_buffers
扩展和/或 gl_FragData[]
输出变量。
此外,如前所述,不清楚为什么不能使用单个 RGBA 纹理并将其 alpha channel 用于该元数据。
关于opengl - 使用 OpenGL 的可编辑纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43856956/