Как реализовать самый простой DOT3 bumpmapping? Самый простой вариант это при помощи двух текстур (diffuse и normal map's)
Первое. Нужно эти текстуры заготовить. Можно воспользоваться утилитой TGAtoDOT3 из RadeonSDK: Далее зарузив текстуры нужно настроить их вывод (нам также потребуется расширение GL_ARB_multitexture - его поддерживают все карты начиная с RIVA TNT и ещё ARB_texture_env_combine, которе поддерживают карты начиная с GeForce 256):
| Код | glPushAttrib(GL_TEXTURE_BIT); // запомним состояние текстурных настроек glActiveTextureARB(GL_TEXTURE0_ARB); // сделаем активной первую текстуру glEnable(GL_TEXTURE_2D); // включим режим наложения для первой текстуры glBindTexture(GL_TEXTURE_2D, normalObj);// "наложим текстуру"
// нормаль будет умножена на вектор источника света glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_DOT3_RGB_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
glActiveTextureARB(GL_TEXTURE1_ARB);// сделаем активной вторую текстуру glEnable(GL_TEXTURE_2D);// включим режим наложения для второй текстуры glBindTexture(GL_TEXTURE_2D, tank2_tex);// "наложим текстуру"
// диффузная текстура будет умножена на предыдущий результат 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_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
//здесь следует просто наложить две текстуры на полигон используя мощь расширения GL_ARB_multitexture ;-) //например так glBegin(GL_TRIANGLES); glNormal3fv(@SmoothNormals[Face[0]]); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, TexVertex.x,TexVertex.y); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, TexVertex.x,TexVertex.y); glVertex3fv(@Vertices[Face[0]]);
glNormal3fv(@SmoothNormals[Face[1]]); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, TexVertex.x,TexVertex.y); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, TexVertex.x,TexVertex.y); glVertex3fv(@Vertices[Face[1]]);
glNormal3fv(@SmoothNormals[Face[2]]); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, TexVertex.x,TexVertex.y); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, TexVertex.x,TexVertex.y);
glVertex3fv(@Vertices[Face[2]]);
glEnd;
glActiveTextureARB(GL_TEXTURE0_ARB);//деактивируем первую текстуру glBindTexture(GL_TEXTURE_2D, 0);// отключим "наложение" первой текстуры glActiveTextureARB(GL_TEXTURE1_ARB);//деактивируем вторую текстуру glBindTexture(GL_TEXTURE_2D, 0); //отключим "наложение" второй текстуры glPopAttrib();// восстановим состояние текстурных настроек
|
Вот в кратце так реализуется DOT3 %-)
M arilou | в следующий раз воспользуйтесь тэгом code |
|