GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (164 стр.)

Сообщения на форуме пользователя Andrey (164 стр.)

Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object3 окт. 200620:27#0
Привет всем!!!
решил переделать рендер моделей из Cаl3d на VBO.

Вот оригинпальный код, тут все основывется что данные пишуться в статическием массивы.

// render all meshes of the model
for(int meshId = 0; meshId < meshCount; meshId++) {
   // get the number of submeshes
   int submeshCount = pCalRenderer->getSubmeshCount(meshId);
    // render all submeshes of the mesh
   for(int submeshId = 0; submeshId < submeshCount; submeshId++) {
      // select mesh and submesh for further data access
      if(pCalRenderer->selectMeshSubmesh(meshId, submeshId)) {
         // get the transformed vertices of the submesh
         static float meshVertices[30000][3];
         int vertexCount = pCalRenderer->getVertices(&meshVertices[0][0]);
      
         // get the transformed normals of the submesh
         static float meshNormals[30000][3];
         pCalRenderer->getNormals(&meshNormals[0][0]);
            // get the texture coordinates of the submesh
         static float meshTextureCoordinates[30000][2];
         int textureCoordinateCount = pCalRenderer->getTextureCoordinates(0, &meshTextureCoordinates[0][0]);

         // get the faces of the submesh
         static CalIndex meshFaces[50000][3];
         int faceCount = pCalRenderer->getFaces(&meshFaces[0][0]);

         // set the vertex and normal buffers
         glVertexPointer(3, GL_FLOAT, 0, &meshVertices[0][0]);
         glNormalPointer(GL_FLOAT, 0, &meshNormals[0][0]);
       
         glDrawElements(GL_TRIANGLES, faceCount * 3, GL_UNSIGNED_INT, &meshFaces[0][0]);   
         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
      
         // adjust the vertex and face counter
         m_vertexCount += vertexCount;
         m_faceCount += faceCount;
      }
   }
}

вот код переделанный на VBO:

// render all meshes of the model
for(int meshId = 0; meshId < meshCount; meshId++) {
   // get the number of submeshes
   int submeshCount = pCalRenderer->getSubmeshCount(meshId);
       // render all submeshes of the mesh
   for(int submeshId = 0; submeshId < submeshCount; submeshId++) {
      // select mesh and submesh for further data access
      if(pCalRenderer->selectMeshSubmesh(meshId, submeshId)) {
         // вершина модели
          struct VERTEX {
            float pos[3];      // позиция
            float normal[3];        // нормаль к вершине
            float tv[2];            // текстурные координаты
         };
         // выбираем вершинный буфер из памяти
         glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_pVB);
         VERTEX *pVertices = NULL;
         // смещение
         size_t offset = m_vertexCount*sizeof(VERTEX);
         // получить из памяти
      pVertices = static_cast<VERTEX *>(reinterpret_cast<char> (glMapBufferARB(GL_ARRAY_BUFFER_ARB,   GL_READ_WRITE_ARB) + offset);
         // получить вершины текстурные координаты и нормали
         int vertexCount =  pCalRenderer->getVerticesNormalsAndTexCoords(pVertices);
         glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_pVB);
         glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
         int *meshFaces = NULL; // индексы
         // выбираем индексный буфер из памяти
         glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_pIB);
         // смещение
         offset = m_faceCount* 3*sizeof(int);
         // получить из памяти
         meshFaces = static_cast<VERTEX *>(reinterpret_cast<char *>(glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,    GL_READ_WRITE_ARB) + offset);
         // копируем индексы
         int faceCount = pCalRenderer->getFaces(meshFaces);
         glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, m_pIB);
         glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
         // вставляем указатель на массив вершин
              glVertexPointer(3, GL_FLOAT, sizeof(VERTEX), static_cast<char *>(NULL) + m_vertexCount * sizeof(VERTEX));
              // выставляем указатель на массив нормалей
              glNormalPointer(GL_FLOAT, sizeof(VERTEX), static_cast<char *>(NULL) + m_vertexCount * sizeof(VERTEX) + 3 * sizeof(float));
              glEnableClientState(GL_TEXTURE_COORD_ARRAY);
              // высталяем указатель на массив текстурных координат
         glTexCoordPointer(2, GL_FLOAT, sizeof(VERTEX), static_cast<char *>(NULL) + m_vertexCount * sizeof(VERTEX) + 6 * sizeof(float));
         // отображение
         glDrawElements(GL_TRIANGLES, faceCount * 3, GL_UNSIGNED_INT, static_cast<char *>(NULL) + m_faceCount * sizeof(unsigned int));   
         // adjust the vertex and face counter
              m_vertexCount += vertexCount;
              m_faceCount += faceCount;
      }
   }
}
модель рендериься неправильно что я делаю не так?
вот скриншот объясняющий проблему:
Изображение удалено
Спасибо всем заранее.

Незакрываемый процесс28 сен. 200610:55#7
Cat
У меня закрылась ;)
Вообще Delphi остой ты в курсах ? ;)
Скелетная анимация27 сен. 200616:29#1
Ronin
посмотри может поможет
http://tfc.duke.free.fr/coding/md5-specs-en.html
Стандартный DXUTgui - интерфейс. Как изменить?27 сен. 200611:06#16
Plastic
ну тогда стучись в аську.
Стандартный DXUTgui - интерфейс. Как изменить?26 сен. 200612:31#14
Plastic
>1. а зачем от него избавляцца? обоснуй... что с ID3DXSprite не так?
ну не совсем его рекомендуют профессионалы лучше ручками текстуру на квадрат натянуть и рендерить.
>2. Честно говоря не понял смысла... по моему вОпенЖЛ проще свой написать чем этот переделывать...
а там только поменять IDirect3DDevice9::SetRenderState на glEnable и т.д. и DrawPrimitiveUP на glVertexPointer/glDrawArrays
это будет проще чем писать заново
вообще данной переделкой можно заняться вместе если есть желание ;) у меня уже написан загрузчик GUI из файла.
Стандартный DXUTgui - интерфейс. Как изменить?26 сен. 200611:11#12
Plastic
1) можешь избавиться от ID3DXSprite?
2) переписав это на DrawPrimitiveUP и вынести рендер из GUI можно сделать рендер GUI и на OpenGL.
Проблема с шейдерами25 сен. 200615:58#3
debugx
  D3DCAPS9 caps;
// получить данные о возможностях видео карты
  pDevice->GetDeviceCaps(&caps);
...
  // строки с версиями шедеров
  const char * v10 = "1.0";
  const char * v11 = "1.1";
  const char * v12 = "1.2";
  const char * v13 = "1.3";
  const char * v14 = "1.4";
  const char * v20 = "2.0";
  const char * v30 = "3.0";
  // информация о пиксельных шейдерах
  switch (caps.PixelShaderVersion) {
    case D3DPS_VERSION(1, 0):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::PIXEL_SHADER_VERSION], v10, "\n");
    break;
    case D3DPS_VERSION(1, 1):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::PIXEL_SHADER_VERSION], v11, "\n");
    break;
    case D3DPS_VERSION(1, 2):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::PIXEL_SHADER_VERSION], v12, "\n");
    break;
    case D3DPS_VERSION(1, 3):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::PIXEL_SHADER_VERSION], v13, "\n");
    break;
    case D3DPS_VERSION(1, 4):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::PIXEL_SHADER_VERSION], v14, "\n");
    break;
    case D3DPS_VERSION(2, 0):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::PIXEL_SHADER_VERSION], v20, "\n");
    break;
    case D3DPS_VERSION(3, 0):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::PIXEL_SHADER_VERSION], v30, "\n");
    break;
  }
  // информация о вершинных шейдерах
  switch (caps.VertexShaderVersion) {
    case D3DVS_VERSION(1, 1):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::VERTEX_SHADER_VERSION], v10, "\n");
    break;    
    case D3DVS_VERSION(2, 0):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::VERTEX_SHADER_VERSION], v20, "\n");
    break;
    case D3DVS_VERSION(3, 0):
      OutMessage(Console::INFO_MESSAGE, "%s%s%s", Console::StdMessage[Console::VERTEX_SHADER_VERSION], v30, "\n");
    break;
  }
Cal3D. Как в повернуть персонажа ?25 сен. 200613:12#6
ns_neo_
>так на сколько я помню, это просто нужно в максе Pivot ориентировать по Y и нормально будет
>:)) да только анимировать будет неудобно

>а лучше его трансформ скрутить на нужный угол
ну тут ситуация такая у меня менеджер ресурсов пытается преобретать продвинутую функциональность, поэтому я могу задать в загрузки дополнительные параметры, к примеру  повернуть персонажа программно или нет? вот бы и хотелось что-бы
можно было это делать/не делать без участия 3D Studio Max, т.е. не просить моедельера первернуть модель.
>да и еще не забывай там в Cal3D обязательно calculateState(); проделывать
ну а немного поподробней?
вот тьут я перевернул Y и Z:

// тут загрузили Mesh
  // цикл по субмешам меша
          for(int i = 0; i < mesh->getCoreSubmeshCount(); i++) {
            // получить i- субмешь
            CalCoreSubmesh *subMesh = mesh->getCoreSubmesh(i);
            // считать число полигонов
            faceCount += subMesh->getFaceCount();
            // цикл по под мешу вершины
            for(size_t j  = 0; j < subMesh->getVectorVertex().size(); j++) {
              // обмен z ,y 
              //std::swap(subMesh->getVectorVertex()[j].position.y, subMesh->getVectorVertex()[j].position.z);
            }
          }

потом призарузке все модели выщвать метод calculateState() для костей и скелета?
короче разговор можно продолжмть в аське, я стучусь

Правка: тег

Правка: 25 сен. 2006 13:14

Cal3D. Как в повернуть персонажа ?25 сен. 200612:49#3
ns_neo_
дело в том что в некоторых редакторах в часности в 3D Studio MAX ось Z направлена вверх, а в OpenGL/Direct3D направлена вперед. поэтомк мне попадаются модели у которых первернуты координаты. Поэтому я и в загрузчике пробывал перевернуть персонажа поменяв значения координат z и y. Но этого оказалосьмало. надо еще  по ходу дела менять скелет.
Cal3D. Как в повернуть персонажа ?25 сен. 200611:17#1
ns_neo_
Во во!!!! у меня такая-жк проблема!!!
попробывал std::swap(y, z) этого оказалось недостаточно... ;(
Выбор типа анимации25 сен. 200610:42#6
Osiris
>На сколько я знаю ( если ошибаюсь - поправьте меня пожалуйста ), MD2, MD3 форматы нельзя использовать в коммерческих >целях.
уже можно исходники Quake III открыты и форматы MD2/MD3 скорей всего оможно использовать. переделать рендер под с OpenGL под Direct3D элементарно. Вот бы еще всю геометрию загнать в единый IDirect3DVertexBuffer9 было бы совсем хорошо.
Стандартный DXUTgui - интерфейс. Как изменить?22 сен. 200613:38#9
Plastic
>Все, все сделал, если интересно, могу отписать как.
>Результат - можно делать вместо стандартного DX-интерфейса любой свой... :) ]
Я тоже все то копал текстуру выгреб и записал в файл
Ну ка поделись еще не мешало бы что-бы не зависило от API.
Perlin Noise Water19 сен. 200616:24#41
tav
Забыл кстати
GeForce 6600
9.0  - обычная версия
30.6  - lowEnd версия
Intel Pentium 2.8 Гц

Perlin Noise Water19 сен. 200615:30#39
tav
Ну просто супер молодец!!!
Зацените библиотеку19 сен. 200610:50#24
rAvEn
ну вот я сказал чтьо ситуация с моделями Md5 изменилась:
...
 /* draw model */
  for (i = 0; i < md5file->num_meshes; ++i)
    {
      PrepareMesh (&md5file->meshes[i], md5file->baseSkel);

      glVertexPointer (3, GL_FLOAT, 0, vertexArray);

      glDrawElements (GL_TRIANGLES, md5file->meshes[i].num_tris * 3,
          GL_UNSIGNED_INT, vertexIndices);
    }
...

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр