PDA

View Full Version : Colour Threshold Alpha



benlad
09-29-2011, 09:36 AM
Hi All,
I have a 2D texture and wish set the alpha based on the colour intensity (R+G+B), with the intention of making colours below a certain threshold totally transparent. Is there an straightforward method to achieve this? Or a better method of making colours below a certain threshold transparent?
TIA

V-man
09-30-2011, 03:59 AM
I you want to perform customized operations like that during runtime, you use shaders. Sample the texture and perform whatever operation you want and then output.

If you don't need it at runtime, then do it on the CPU.

If you just need to have threshold for alpha value, then there is the GL_ALPHA_TEST which is available since GL 1.0

benlad
10-03-2011, 03:58 AM
Thanks for the pointers. I have tried implementing the (my first) shader as such:


uniform float threshold;
uniform sampler2D texture;
void main()
{
gl_FragColor = texture2D(texture, gl_TexCoord[0].xy);
float intensity = gl_FragColor.r + gl_FragColor.g + gl_FragColor.b;
if(intensity < 0.2)
discard;
}

This works, but if I change the explicit 0.2 value to my uniform float threshold value, it does not work.

The uniform values are set up like this:


GLint thresholdLoc = glGetUniformLocation(fragmentProgram, "threshold");
if(thresholdLoc != - 1)
{
glUniform1f(thresholdLoc, 0.2);
}

GLint texNumLoc = glGetUniformLocation(fragmentProgram, "texture");
if(texNumLoc != - 1)
{
glUniform1i(texNumLoc, m_texNum);
}

V-man
10-03-2011, 05:04 AM
Don't read from gl_FragColor. It is write only variable.

When you call glUniform1i, the right shader must be bound. Maybe you have another one bound?

There is an app for that
glUniform_doesn.27t_work (http://www.opengl.org/wiki/GLSL_:_common_mistakes#glUniform_doesn.27t_work)

benlad
10-04-2011, 01:36 AM
Yes, you are right. Didn't set the threshold (float) uniform value after glUseProgram. The sampler2D uniform seems to work if it is set prior to glUseProgram though.

Many thanks.

V-man
10-04-2011, 04:26 AM
The sampler2D uniform seems to work if it is set prior to glUseProgram though.
It doesn't. It is left to its default value of 0.

benlad
10-04-2011, 04:57 AM
I see. All makes sense now. Thanks.