Hello,
I am trying to setup differents way of blending textures with multitexturing using opengl’s texture units.
first, I can blend two textures in this way using 3 TU:
glBlendFunc(GL_ONE, GL_ZERO);
glClientActiveTexture( GL_TEXTURE0_ARB );
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer( GL_ARRAY_BUFFER, mapTexCoordBuffer );
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glActiveTexture( GL_TEXTURE0_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, terrainTexList[2].glID );
glClientActiveTexture( GL_TEXTURE1_ARB );
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer( GL_ARRAY_BUFFER, mapTexCoordBuffer );
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glActiveTexture( GL_TEXTURE1_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, terrainTexList[1].glID );
glClientActiveTexture( GL_TEXTURE2_ARB );
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer( GL_ARRAY_BUFFER, mapTexCoordBuffer );
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glActiveTexture( GL_TEXTURE2_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, terrainTexList[0].glID );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE1 );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE2 );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_TEXTURE0 );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_ONE_MINUS_SRC_COLOR );
In tis way textures terrainTexList[0].glID and terrainTexList[1].glID are correctly blended with terrainTexList[2].glID as t factor ( this is a grayscale texture), but mesh lighting disappears…this is logical!
So, in order to keep lighting without a lightmap I have tried to do this:
glBlendFunc(GL_ONE, GL_ZERO);
glClientActiveTexture( GL_TEXTURE0_ARB );
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer( GL_ARRAY_BUFFER, mapTexCoordBuffer );
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glActiveTexture( GL_TEXTURE0_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, terrainTexList[0].glID );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE0 );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
glClientActiveTexture( GL_TEXTURE1_ARB );
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer( GL_ARRAY_BUFFER, mapTexCoordBuffer );
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glActiveTexture( GL_TEXTURE1_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, terrainTexList[2].glID );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1 );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
glBlendFunc(GL_ONE, GL_ONE);
glClientActiveTexture( GL_TEXTURE2_ARB );
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer( GL_ARRAY_BUFFER, mapTexCoordBuffer );
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glActiveTexture( GL_TEXTURE2_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, terrainTexList[1].glID );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE2 );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1 );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR );
So in the first unit I active terrainTexList[0].glID and apply this to the mesh. If we stop here we see the terrainTexList[0].glID applied on mesh with lighting.
Then in the 2nd unit I active terrainTexList[2].glID and multiply this with the last texture applied on mesh ( terrainTexList[0].glID + lighting).
Finally I would multiply terrainTexList[1].glID with terrainTexList[2].glID inverted and apply this to the screen without replace the last screen render, so just add the last unit result to the screen. In order to this I setup the glBlendFunc to GL_ONE for the source and GL_ONE for the destination; and in my opinion the last render on the screen due to the 1st and the 2nd units would not be replaced…but when start the program I see only the third unit result on the screen!
So there is a problem in my reflexion…can you help me?
Thank you.