This is my first post, and I’ve only recently started programming for Android and OpenGl, so be nice to me 🙂
I’m writing a little app that will include one screen that will use a palettised image for quick changes in colour. For speed I thought I could implement the system using a shader, so I have a shader up and running using the fantastic examples from the Open GL ES 2.0 programming guide. The problem that I’ve been banging my head over for the past couple of days is coming up with a way of referencing my palette data within the shader.
My shader currently is:
precision lowp float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform int s_palette[204]; // Specify a palette of 64 rgb entries
void main()
{
vec4 col = texture2D( s_texture, v_texCoord );
int index = (int(col.r * 255.0) * 3;
gl_FragColor = vec4(float(s_palette[index]) / 255.0, float(s_palette[index+1]) / 255.0, float(s_palette[index+2]) / 255.0, 1.0);
}
After playing around with this for ages and not getting very far I discovered that if I reference my palette data by a constant value I could get results, but not by referencing with a variable. Having searched for a while with Google I discovered that this was just the way it was with GLSL 1.1 and was fixed with GLSL 1.3. I believe Android is running on GLSL ES1.0 which is based on GLSL 1.3, so it should work, but I can’t for the life of my get it to work. I can’t find anything in the GLSLES specs that would suggest it’s not possible either, so where am I going wrong?
If it simply isn’t possible, then does anyone have any other ideas how to get around this rather crippling flaw in my plan?
No, constant arrays can’t be indexed by variables, but you can easily do a palette lookup using textures instead of a constant data array. Use a Nx1 2D texture and do a lookup using texture2D in GLSL.
Of course you will need to load the texture data from the CPU side using the normal texture functions in OpenGL.