PDA

View Full Version : One see-through texture on top of another...



stacy0707
04-17-2003, 07:29 AM
I am trying to have one texture sit on top of another and be transparent. I am using the code listed below. When this renders it makes both textures have the same transparency. Anyone know how to fix this?

glActiveTextureARB( GL_TEXTURE0_ARB );
glEnable( GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_pTextures[0]);
glDisable(GL_BLEND);
glDisableClientState(GL_COLOR_ARRAY);

glActiveTextureARB( GL_TEXTURE1_ARB );
glEnable( GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_pTextures[1]);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4,GL_FLOAT,0,m_pfColors);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,m_pfVertices);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2,GL_FLOAT,0,m_pfTexCoords1);

glDrawArrays(GL_TRIANGLE_STRIP,0,NEW_VERTICES);

thanks in advance!

Obli
04-17-2003, 09:15 AM
Not sure about this however, I heard of the tex env color.

A texture environment (texture unit) has more than just texture and texcoord. It also has this. Don't know however what it is, never checked it out, however, I hope this may help you.

Bye!

jra101
04-17-2003, 02:34 PM
Blending is not a per texture unit state and neither are color arrays. If you want your code snippet to work, you are going to need to either draw your geometry twice (first time with blending and color arrays disabled, second time with blending and color arrays enabled) or you are going to store the alpha value for each texture in the textures alpha channel instead of using the per vertex alpha value.

jwatte
04-17-2003, 03:47 PM
The spec is very clear:

Lighting, Materials and/or vertex colors generate an incoming fragment color (and possibly a separate specular, "second color").

Fragment color goes through some number of texture environments. Each texture environment may apply the interpolated color value fetched from a texture to the incoming fragment value, resulting in an output fragment value. The possible modes include MODULATE, DECAL, ADD, REPLACE and COMBINE. Each texture environment is specified using ActiveTexture() and TexEnv(). The filtering parameters are specified with TexParameter(). TexParameter() sticks with the texture object, TexEnv() does not.

At the end, the last outgoing fragment color is summed with the second color, possibly has fog applied to it, and is then either written to the framebuffer, or if blending is turned on, is blended with the framebuffer using the src and dst weight factors specified by BlendFunc().

There are a number of improvements and extensions which add to this model, but understanding the above will give you a very solid ground on which to base your decisions about how to apply different texture layers; assuming you know mathematically what it is you want to accomplish (i e, when to use MODULATE, ADD or DECAL for example).

stacy0707
04-17-2003, 05:19 PM
Is it possible then to modify the textures alpha texture at run time or does this have to be predefined?

jwatte
04-17-2003, 07:52 PM
Look at GL_COMBINE and the texture_env_crossbar extension (or the register_combiners extension, for nVIDIA).

Also, look at ARB_fragment_program, which lets you do almost anything.