Делаю на расширениях, если использовать один объект то можно наложить хоть 10 текстур, я проверял. Бока появляются если объектов больше.
glDisable(...) пишу потому-то подсказали "вродебы" знающие люди.
сейчас попробую более точно описать:
//есть такие массивы, размер у обоих одинаковый
int массив_текстурных_ид_0[...];
int массив_текстурных_ид_1[...];
int массив_текстурных_ид_2[...];
string массив_имен_текстур_0[...];
string массив_имен_текстур_1[...];
string массив_имен_текстур_2[...];
класс_объектов объект[...];
//у объекта есть ссылки на используемые текстуры и соответственно идентефикаторы
// далее буду писать гдето так массив_текстурных_ид_0[ объект.номер ]
//--------------------------другой модуль---------------------------
.....
//далее идет инициализация
for(int i(0); i<размер_массива; ++i)
{
glActiveTextureARB ( GL_TEXTURE0_ARB );
glGenTextures(1, &массив_текстурных_ид_0[i]);
//генерация текстуры упрощенная)
glBindTexture(GL_TEXTURE_2D, массив_текстурных_ид_0[i])
glEnable(GL_TEXTURE_2D);
glTexEnvi(.....);
glActiveTextureARB ( GL_TEXTURE1_ARB );
glGenTextures(1, &массив_текстурных_ид_1[i]);
glBindTexture(GL_TEXTURE_2D, массив_текстурных_ид_1[i])
glEnable(GL_TEXTURE_2D);
glTexEnvi(.....);
glActiveTextureARB ( GL_TEXTURE2_ARB );
glGenTextures(1, &массив_текстурных_ид_2[i]);
glBindTexture(GL_TEXTURE_2D, массив_текстурных_ид_2[i])
glEnable(GL_TEXTURE_2D);
glTexEnvi(.....);
}
......
//--------------------------другой модуль---------------------------
.....
//после инициализации идет рендер
for(int i(0); i<количество_объектов; ++i)
{
glBindTexture(GL_TEXTURE_2D, массив_текстурных_ид_2 [ объект[i].номер ])
glBindTexture(GL_TEXTURE_2D, массив_текстурных_ид_1 [ объект[i].номер ])
glBindTexture(GL_TEXTURE_2D, массив_текстурных_ид_0 [ объект[i].номер ])
glBegin(GL_TRIANGLES);
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_TEXTURE_2D);
glMultiTexCoord2f( GL_TEXTURE0_ARB, объект[i].ТекстурнаяКоординатаХ, объект[i].ТекстурнаяКоординатаY );
glNormal3f(....);
glVertex3f(....);
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);
glMultiTexCoord2f( GL_TEXTURE1_ARB, объект[i].ТекстурнаяКоординатаХ, объект[i].ТекстурнаяКоординатаY );
glNormal3f(....);
glVertex3f(....);
glActiveTextureARB(GL_TEXTURE2_ARB);
glDisable(GL_TEXTURE_2D);
//текстурные координаты у меня вобщемто разные)
glMultiTexCoord2f( GL_TEXTURE2_ARB, объект[i].ТекстурнаяКоординатаХ, объект[i].ТекстурнаяКоординатаY );
glNormal3f(....);
glVertex3f(....);
glEnd();
}
.....
Вот чего-то типо такого написано, а еще я нашел такой код
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture1);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture2);
glBegin(GL_TRIANGLES);
glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, @TextureVertex[i, TextureFace[i, j].V1]);
glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, @LMTextureVertex[i, LMTextureFace[i, j].V1]);
glVertex3fv(@Vertex[i, face[i, j].V1]);
glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, @TextureVertex[i, TextureFace[i, j].V2]);
glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, @LMTextureVertex[i, LMTextureFace[i, j].V2]);
glVertex3fv(@Vertex[i, face[i, j].V2]);
glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, @TextureVertex[i, TextureFace[i, j].V3]);
glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, @LMTextureVertex[i, LMTextureFace[i, j].V3]);
glVertex3fv(@Vertex[i, face[i, j].V3]);
glEnd();
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTextureARB(GL_TEXTURE0_ARB);
я так понял чтобы наложить 3 текстуры нужно 3 захода делать?
Просьба написать все тонкости мультитекстурирования, т.к. я уже говорил примера с кучей объектов я не нашел
|