Hy,this is my first post…
I’ve a problem with DOT3 Bump mapping, if I render only the Bump texure all semms ok but when I enable the second unit the result it’s wrong…
DOT3 Texture only: http://www.lib.unimib.it/students/bianchifr/3d/bump00.jpg
Final: http://www.lib.unimib.it/students/bianchifr/3d/bump01.jpg
…here’s my code:
…
glEnableClientState ( GL_COLOR_ARRAY );
//--------- dot3 bump map --------------------------------------------------
glClientActiveTexture(GL_TEXTURE0_ARB);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, Scene.Texture[ CMat.Bump->MapRef].Map);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT );
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT , GL_DOT3_RGB_EXT );
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT , GL_TEXTURE );
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR );
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT , GL_PRIMARY_COLOR_EXT );
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR );
//---------- base texture --------------------------------------------------
glClientActiveTexture(GL_TEXTURE1_ARB);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, Scene.Texture[ CMat.Diffuse->MapRef].Map);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT );
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT , GL_MODULATE );
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT , GL_PREVIOUS_EXT );
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR );
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT , GL_TEXTURE );
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR );
//---------------------------------------------------------------------------
glDisable(GL_LIGHTING);
int Offset = O.Offset;
float m[9], lv[3], tc[3], len;
for (int j=0 ; j<O.NTriangle ; j++)
{
for( int k=0 ; k<3 ; k++)
{
// Vettore Luce
lv[0]=(Scene.Light[0].Position[0] - Scene.VBuffer[O.Triangle[j].Edge[k]].Coord[0]);
lv[1]=(Scene.Light[0].Position[1] - Scene.VBuffer[O.Triangle[j].Edge[k]].Coord[1]);
lv[2]=(Scene.Light[0].Position[2] - Scene.VBuffer[O.Triangle[j].Edge[k]].Coord[2]);
len=(float)sqrt((lv[0]*lv[0])+(lv[1]*lv[1])+(lv[2]*lv[2]));
if(len != 0.0f)
{
lv[0] /=len;
lv[1] /=len;
lv[2] /=len;
}
// Tangent Space
m[0]=O.DOT3Vertex[ O.Triangle[j].Edge[k]-Offset ].Tg[0];
m[1]=O.DOT3Vertex[ O.Triangle[j].Edge[k]-Offset ].Bn[0];
m[2]=Scene.VBuffer[O.Triangle[j].Edge[k]].Normal[0];
m[3]=O.DOT3Vertex[ O.Triangle[j].Edge[k]-Offset].Tg[1];
m[4]=O.DOT3Vertex[ O.Triangle[j].Edge[k]-Offset].Bn[1];
m[5]=Scene.VBuffer[O.Triangle[j].Edge[k]].Normal[1];
m[6]=O.DOT3Vertex[ O.Triangle[j].Edge[k]-Offset].Tg[2];
m[7]=O.DOT3Vertex[ O.Triangle[j].Edge[k]-Offset].Bn[2];
m[8]=Scene.VBuffer[O.Triangle[j].Edge[k]].Normal[2];
// Ruotiamo lv in TangentSpace per essere nello stesso spazio delle normali
tc[0]=(lv[0]*m[0])+(lv[1]*m[3])+(lv[2]*m[6]);
tc[1]=(lv[0]*m[1])+(lv[1]*m[4])+(lv[2]*m[7]);
tc[2]=(lv[0]*m[2])+(lv[1]*m[5])+(lv[2]*m[8]);
// Colore per Vertice
tc[0]=(tc[0]*0.5f)+0.5f;
tc[1]=(tc[1]*0.5f)+0.5f;
tc[2]=(tc[2]*0.5f)+0.5f;
O.DOT3Vertex[O.Triangle[j].Edge[k]-Offset].Color[0] = tc[0];//FLOAT_TO_UBYTE(tc[0]);
O.DOT3Vertex[O.Triangle[j].Edge[k]-Offset].Color[1] = tc[1];//FLOAT_TO_UBYTE(tc[1]);
O.DOT3Vertex[O.Triangle[j].Edge[k]-Offset].Color[2] = tc[2];//FLOAT_TO_UBYTE(tc[2]);
O.DOT3Vertex[O.Triangle[j].Edge[k]-Offset].Color[3] = 1.0f;
if (RenderMode == ATI)
{
glUpdateObjectBufferATI( ATI_VBuffer ,
8*SFLOAT+((O.Triangle[j].Edge[k])*sizeof(_Vertex)) ,
4*SFLOAT,
O.DOT3Vertex[O.Triangle[j].Edge[k]-Offset].Color,
GL_DISCARD_ATI);
}
}
}
switch ( RenderMode)
{
case ATI :
{
glArrayObjectATI(GL_ELEMENT_ARRAY_ATI, 1, GL_UNSIGNED_INT, 0, O.IBuffer , 0);
glDrawElementArrayATI( GL_TRIANGLES, O.NVertex );
} break;
}
…
Someone can help me?!?
thanks and sorry for my english