PMG

Форумы по созданию игр
Текущее время: 26 сен 2021 14:07

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Применение нескольких текстур на один объект
СообщениеДобавлено: 23 мар 2013 14:23 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 06 ноя 2011 14:35
Сообщения: 7
Привет!
Есть модель экспортированная из 3д макса имеющая две текстуры головы и туловища:
Вложение:
1.JPG

Как наложить две текстуры в OpenGL ?
Обычным способом получается так:
Вложение:
2.JPG

Вложение:
3.JPG

Сама модель в формате .3DS, если я загружаю модель к примеру в Blitz то
текстуры ложатся как положено.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Применение нескольких текстур на один объект
СообщениеДобавлено: 23 мар 2013 14:50 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 06 ноя 2011 14:35
Сообщения: 7
Вот архив с моделью и текстурами:
Вложение:
Archive.rar


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Применение нескольких текстур на один объект
СообщениеДобавлено: 25 мар 2013 13:12 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Фактически это две разные модели с разными текстурами. Сначал одна модель с одной текстурой, потом другая.
Я типо такого делал:
Код:
  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);
    }

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Применение нескольких текстур на один объект
СообщениеДобавлено: 25 мар 2013 19:29 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 06 ноя 2011 14:35
Сообщения: 7
Нет это одна модель, дело в том что при экспорте модели у неё есть субматериалы, 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Применение нескольких текстур на один объект
СообщениеДобавлено: 27 мар 2013 16:33 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
В 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);
    }

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Применение нескольких текстур на один объект
СообщениеДобавлено: 28 мар 2013 18:27 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 06 ноя 2011 14:35
Сообщения: 7
Большое спасибо, буду пробовать.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB