我正在尝试利用gpu的并行性来使图像处理应用程序。我有一个着色器,它采用两个纹理,并基于一些统一变量,计算输出纹理。但是,不是透明度alpha值,每个纹理像素都需要一个额外的元数据字节,在计算中是必需的:
所以我考虑每帧运行着色器两次,一次计算动态元数据作为单字节纹理,一次计算得到的Paint Texture,我需要3个字节(以限制内存使用,因为可能是一些这样的纹理一次加载。)
我发现上面的问题有点复杂,我用opengl来绘制 屏幕,但这次我需要绘制两种不同的纹理, 我不知道怎么办。另外,gl_FragColor内置变量 type是vec4,但我需要不同的输出值。
上面很容易通过cpu上的blitting纹理来完成。 我可以将所有相关数据保存在cpu上,完成所有工作60次/秒, 并通过将数据从CPU传递到gpu来更新相关的纹理。 用于每帧改变纹理的相对较小的区域 (大约约512x512大小纹理的总规模的约20%),你会认为上述方法值得麻烦吗?
答案 0 :(得分:0)
这取决于您使用的OpenGL版本。
最新的OpenGL 4+没有gl_FragColor
变量,而是允许您从片段着色器中写入任何数字(最多支持的最大值)输出颜色,每个都发送到相应的帧缓冲颜色附件:< / p>
layout(location = 0) out vec4 OUT0;
layout(location = 1) out float OUT1;
这会将OUT0
写入当前绑定的帧缓冲区的GL_COLOR_ATTACHMENT0
和OUT1
到GL_COLOR_ATTACHEMENT1
。
但是,考虑到您使用gl_FragColor
,您使用的是旧版本的OpenGL。我不熟悉旧的旧版OpenGL版本,但您可以查看您的实现是否支持GL_ARB_draw_buffers
扩展名和/或gl_FragData[]
输出变量。
另外,如上所述,目前还不清楚为什么不能使用单个RGBA纹理并将其alpha通道用于该元数据。