Joł miśki. Z shaderów jestem niestety słaby jak mięśnie Najmana... znalazłem sobie shader na blura, jest fajny, ale chciałbym móc mu przekazywać jak mocny na być ten blur. Próbowałem przez shader_set_uniform, ale po wielu próbach wyszło mi na to, że ponieważ jest tam pętla for, to w trakcie kompilacji to jest konwertowane na normalne polecenia na podstawie liczby w pętli i jeśli podam własną zmienną, to się gra nie kompiluje...
Vertex
attribute vec3 in_Position; // (x,y,z)
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}
Fragment
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
//uniform int u_iSize; // Filter size
uniform vec2 u_vTexelSize;
void main()
{
gl_FragColor = vec4(0.0,0.0,0.0,1.0);
int size = 9; // Square filter size. Must be >=3 and uneven to work.
int elems = size*size;
size /= 2;
for(int i = -size;i <= size;i++) {
for(int j = -size;j <= size;j++) {
vec2 offset = vec2(float(i)*u_vTexelSize.x,float(j)*u_vTexelSize.y);
gl_FragColor += v_vColour * texture2D( gm_BaseTexture, v_vTexcoord + offset);
}
}
gl_FragColor.rgba /= float(elems);
Więc jeśli zamiast int size = 9; zrobiłem u_iSize, to niestety się kompilator wywala.
Ktoś ma pomysł? Ten blur całkiem zacnie wygląda, ale chciałbym go płynnie zwiększać bez rysowania surface na surface i alpha blendingu, zresztą wtedy widać że blur nie rośnie a jest druga warstwa.