Texture Combiners
Texture combiners became core in GL 1.3. You can combine by multiplying, replacing, adding, subtracting, DOT3 product.
GL 1.4 added to the core a crossbar feature. This means that you sample GL_TEXTUREX from any other texture image unit (TIU).
Example : multiply tex0 and tex1
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID0); //Simply sample the texture glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //------------------------ glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textureID1); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); //Sample RGB, multiply by previous texunit result glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); //Sample ALPHA, multiply by previous texunit result glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
The equivalent with GL 2.0 shaders
//Fragment shader uniform sampler2D Texture0; uniform sampler2D Texture1; //------------------------ varying vec2 TexCoord0; varying vec2 TexCoord1; //Or just use TexCoord0 //------------------------ void main() { vec4 texel = texture2D(Texture0, TexCoord0); texel *= texture2D(Texture1, TexCoord1); gl_FragColor = texel; }
Example : Blend tex0 and tex1 based on a blending factor you supply
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID0); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //------------------------ glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textureID1); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR); //------------------------ glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE); //GL_CONSTANT refers to the call we make with glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, mycolor) glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA); //------------------------ float mycolor[4]; mycolor[0]=mycolor[1]=mycolor[2]=0.0; //RGB doesn't matter since we are not using it mycolor[3]=0.75; //Set the blend factor with this glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, mycolor);
The equivalent with GL 2.0 shaders
//Fragment shader uniform sampler2D Texture0; uniform sampler2D Texture1; uniform float BlendFactor; //------------------------ varying vec2 TexCoord0; varying vec2 TexCoord1; //Or just use TexCoord0 //------------------------ void main() { vec4 texel0 = texture2D(Texture0, TexCoord0); vec4 texel1 = texture2D(Texture1, TexCoord1); gl_FragColor = mix(texel0, texel1, BlendFactor); }