我正在为2D冲击波制作一个后处理GLSL(ES)片段着色器,与单个冲击波相比,将纹理略微扭曲很容易,并且已经可以实现。现在我需要同时支持多个冲击波,我的想法如下:
第一种想法: 对每个冲击波进行后处理(绑定FBO-》绑定先前的纹理-》绘制调用)。易于实现,但需要大量状态更改和绘制调用。
第二种想法:添加包含所有冲击波信息的数据纹理和一个表示波数的统一变量,这样我就可以像这样做:
uniform int count;
uniform sampler2D dataTex;
const float dataTexSize = 32;
[...]
vec4 pixel;
for(int i = 0; i < count; i++)
{
vec2 dataTexPos = vec2(i / dataTexSize, 0);
pixel += shockwave(texture2D(dataTex, dataTexPos));
}
pixel /= float(count);
[...]
但显卡似乎不喜欢带有非常量表达式的循环,而驱动程序无法展开循环。
是否有最佳实践可以为着色器提供“动态量的工作”?我的OpenGL版本是2.0 ES。