可编辑纹理与OpenGL

时间:2017-05-08 20:42:56

标签: opengl glsl

我正在尝试利用gpu的并行性来使图像处理应用程序。我有一个着色器,它采用两个纹理,并基于一些统一变量,计算输出纹理。但是,不是透明度alpha值,每个纹理像素都需要一个额外的元数据字节,在计算中是必需的:

enter image description here

所以我考虑每帧运行着色器两次,一次计算动态元数据作为单字节纹理,一次计算得到的Paint Texture,我需要3个字节(以限制内存使用,因为可能是一些这样的纹理一次加载。)

我发现上面的问题有点复杂,我用opengl来绘制 屏幕,但这次我需要绘制两种不同的纹理, 我不知道怎么办。另外,gl_FragColor内置变量 type是vec4,但我需要不同的输出值。

  • 因此,总结一下,片段着色器是否可以输出 除了vec4以外的任何东西?
  • 是否可以通过一次通话保存到两个不同的纹理?
  • 是否可以制作可编辑的纹理来存储更改,直到编辑结束并且必须将数据传递回cpu?
  • 对于上述内容,哪些openGL调用最有用?
  • 还应该能够检索绘制纹理以在屏幕上显示。

上面很容易通过cpu上的blitting纹理来完成。 我可以将所有相关数据保存在cpu上,完成所有工作60次/秒, 并通过将数据从CPU传递到gpu来更新相关的纹理。 用于每帧改变纹理的相对较小的区域 (大约约512x512大小纹理的总规模的约20%),你会认为上述方法值得麻烦吗?

1 个答案:

答案 0 :(得分:0)

这取决于您使用的OpenGL版本。

最新的OpenGL 4+没有gl_FragColor变量,而是允许您从片段着色器中写入任何数字(最多支持的最大值)输出颜色,每个都发送到相应的帧缓冲颜色附件:< / p>

layout(location = 0) out vec4 OUT0;
layout(location = 1) out float OUT1;

这会将OUT0写入当前绑定的帧缓冲区的GL_COLOR_ATTACHMENT0OUT1GL_COLOR_ATTACHEMENT1

但是,考虑到您使用gl_FragColor,您使用的是旧版本的OpenGL。我不熟悉旧的旧版OpenGL版本,但您可以查看您的实现是否支持GL_ARB_draw_buffers扩展名和/或gl_FragData[]输出变量。

另外,如上所述,目前还不清楚为什么不能使用单个RGBA纹理并将其alpha通道用于该元数据。