PMG https://forum.pmg.org.ru/ |
|
Применение нескольких текстур на один объект https://forum.pmg.org.ru/viewtopic.php?f=1&t=9452 |
Страница 1 из 1 |
Автор: | RomaSoft [ 23 мар 2013 14:23 ] |
Заголовок сообщения: | Применение нескольких текстур на один объект |
Привет! Есть модель экспортированная из 3д макса имеющая две текстуры головы и туловища: Вложение: 1.JPG Как наложить две текстуры в OpenGL ? Обычным способом получается так: Вложение: 2.JPG Вложение: 3.JPG Сама модель в формате .3DS, если я загружаю модель к примеру в Blitz то текстуры ложатся как положено. |
Автор: | RomaSoft [ 23 мар 2013 14:50 ] |
Заголовок сообщения: | Re: Применение нескольких текстур на один объект |
Вот архив с моделью и текстурами: Вложение: Archive.rar
|
Автор: | MagicWolf [ 25 мар 2013 13:12 ] |
Заголовок сообщения: | Re: Применение нескольких текстур на один объект |
Фактически это две разные модели с разными текстурами. Сначал одна модель с одной текстурой, потом другая. Я типо такого делал: Код: for ( i=0; i<count_meshs; i++ ) {
mesh = &meshs[i]; glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)mesh->vertexs); glTexCoordPointer(2, GL_FLOAT, 0, (GLvoid*)mesh->tex_coords); } |
Автор: | RomaSoft [ 25 мар 2013 19:29 ] |
Заголовок сообщения: | Re: Применение нескольких текстур на один объект |
Нет это одна модель, дело в том что при экспорте модели у неё есть субматериалы, getFaceMatID - этой функцией я получаю на каждый треугольник индекс материала. При рендере у меня с материалами всё в порядке, а как быть с текстурами непонятно. Код: for(m=0;m<pMesh.size();m++) { for(t=0;t<pMesh[m]->numFaces;t++) { BindMaterial(pMesh[m]->MatID[t]); glVertex3fv(pMesh[m]->Vert[pMesh[m]->Faces[t].face[0]].Get()); glVertex3fv(pMesh[m]->Vert[pMesh[m]->Faces[t].face[1]].Get()); glVertex3fv(pMesh[m]->Vert[pMesh[m]->Faces[t].face[2]].Get()); } } И ещё, как реализовать этот метод в VBO, чтобы каждый треугольник биндился соответствующим материалом и текстурой. Я точно знаю, что в некоторых движках это возможно к примеру Blitz3D. |
Автор: | MagicWolf [ 27 мар 2013 16:33 ] |
Заголовок сообщения: | Re: Применение нескольких текстур на один объект |
В OGL все однозначно: надо переключать текстуры и координаты для них. Про VBO, где на форуме было... Вначале генеришь буфера: Код: for ( ulong_t i=0; i<count_meshs; i++ ) { glGenBuffers(1, &bufferID[i]); glBindBuffer(GL_ARRAY_BUFFER, bufferID[i]); off_tex[i] = (sizeof(SVector3f) * meshs[i].count_vertexs); off_nor[i] = off_tex[i] + (sizeof(SVector2f) * meshs[i].count_vertexs); glBufferData(GL_ARRAY_BUFFER, ( off_nor[i] + sizeof(SVector3f) * meshs[i].count_vertexs), NULL, GL_STATIC_DRAW ); buf_map = (byte*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); memcpy(buf_map, meshs[i].vertexs, meshs[i].count_vertexs*sizeof(SVector3f)); memcpy((buf_map+off_tex[i]), meshs[i].tex_coords, meshs[i].count_vertexs*sizeof(SVector2f)); memcpy((buf_map + off_nor[i]), meshs[i].normals, meshs[i].count_vertexs*sizeof(SVector3f)); glUnmapBuffer(GL_ARRAY_BUFFER); } glBindBuffer(GL_ARRAY_BUFFER, 0); потом их задаешь Код: glBindBuffer(GL_ARRAY_BUFFER, bufferID[i]); glVertexPointer(3, GL_FLOAT, 0, 0); glTexCoordPointer(2, GL_FLOAT, 0, (GLvoid*)off_tex[i]); if ( yes_blend==true ) glNormalPointer(GL_FLOAT, 0, (GLvoid*)off_nor[i] ); Потом рендеришь: Код: glDrawElements(GL_TRIANGLES, //mesh->count_tri*3, GL_UNSIGNED_INT, mesh->index_tri); mesh->sub_meshs[j].count_tri*3, GL_UNSIGNED_INT, mesh->sub_meshs[j].index_tri); Кстати, только счас увидел, в 3DS есть submesh! Код: for ( j=0; j<mesh->count_sub_meshs; j++ ) {
material = mesh->sub_meshs[j].material; if ( yes_blend==true ) { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material->ambient.v); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material->diffuse.v); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material->specular.v); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, material->emissive.v); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else glDisable(GL_BLEND); tex = (CTexture_OGL *)material->textures[0].tex; if ( tex!=0 ) tex->bind_texture(); // [b]вот здесь привязка текстуры[/b] glDrawElements(GL_TRIANGLES, //mesh->count_tri*3, GL_UNSIGNED_INT, mesh->index_tri); mesh->sub_meshs[j].count_tri*3, GL_UNSIGNED_INT, mesh->sub_meshs[j].index_tri); } |
Автор: | RomaSoft [ 28 мар 2013 18:27 ] |
Заголовок сообщения: | Re: Применение нескольких текстур на один объект |
Большое спасибо, буду пробовать. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |