平均ブラーを取るだけの glsl 用関数ですが載せておきます。遅いので注意。
vec4 GetAverageBlurredValue(
sampler2D target_texture,
vec2 uv_coord,
int width,
int height,
int filter_size_x,
int filter_size_y)
{
vec4 result = vec4(0.0, 0.0, 0.0, 0.0);
float unit_coord_x = 1.0 / float(width);
float unit_coord_y = 1.0 / float(height);
vec2 target_uv_coord;
int x, y;
for (y = -filter_size_y; y <= filter_size_y; ++y)
{
for (x = -filter_size_x; x <= filter_size_x; ++x)
{
target_uv_coord = vec2(uv_coord.x + x * unit_coord_x, uv_coord.y + y * unit_coord_y);
result += texture(target_texture, target_uv_coord);
}
}
result = result / ((filter_size_x * 2 + 1) * (filter_size_y * 2 + 1));
return result;
}
この関数を使って水面に映る光を描画するとこんな感じです。