Сообщения на форуме пользователя Andrey (164 стр.)
Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object | 3 окт. 2006 | 20:27 | #0 |
---|
Привет всем!!!
решил переделать рендер моделей из Cаl3d на VBO.
модель рендериься неправильно что я делаю не так?
вот скриншот объясняющий проблему:
Спасибо всем заранее.
решил переделать рендер моделей из 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 сен. 2006 | 10:55 | #7 |
---|
Cat
У меня закрылась ;)
Вообще Delphi остой ты в курсах ? ;)
У меня закрылась ;)
Вообще Delphi остой ты в курсах ? ;)
Скелетная анимация | 27 сен. 2006 | 16:29 | #1 |
---|
Стандартный DXUTgui - интерфейс. Как изменить? | 27 сен. 2006 | 11:06 | #16 |
---|
Plastic
ну тогда стучись в аську.
ну тогда стучись в аську.
Стандартный DXUTgui - интерфейс. Как изменить? | 26 сен. 2006 | 12:31 | #14 |
---|
Plastic
>1. а зачем от него избавляцца? обоснуй... что с ID3DXSprite не так?
ну не совсем его рекомендуют профессионалы лучше ручками текстуру на квадрат натянуть и рендерить.
>2. Честно говоря не понял смысла... по моему вОпенЖЛ проще свой написать чем этот переделывать...
а там только поменять IDirect3DDevice9::SetRenderState на glEnable и т.д. и DrawPrimitiveUP на glVertexPointer/glDrawArrays
это будет проще чем писать заново
вообще данной переделкой можно заняться вместе если есть желание ;) у меня уже написан загрузчик GUI из файла.
>1. а зачем от него избавляцца? обоснуй... что с ID3DXSprite не так?
ну не совсем его рекомендуют профессионалы лучше ручками текстуру на квадрат натянуть и рендерить.
>2. Честно говоря не понял смысла... по моему вОпенЖЛ проще свой написать чем этот переделывать...
а там только поменять IDirect3DDevice9::SetRenderState на glEnable и т.д. и DrawPrimitiveUP на glVertexPointer/glDrawArrays
это будет проще чем писать заново
вообще данной переделкой можно заняться вместе если есть желание ;) у меня уже написан загрузчик GUI из файла.
Стандартный DXUTgui - интерфейс. Как изменить? | 26 сен. 2006 | 11:11 | #12 |
---|
Plastic
1) можешь избавиться от ID3DXSprite?
2) переписав это на DrawPrimitiveUP и вынести рендер из GUI можно сделать рендер GUI и на OpenGL.
1) можешь избавиться от ID3DXSprite?
2) переписав это на DrawPrimitiveUP и вынести рендер из GUI можно сделать рендер GUI и на OpenGL.
Проблема с шейдерами | 25 сен. 2006 | 15: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 сен. 2006 | 13:12 | #6 |
---|
ns_neo_
>так на сколько я помню, это просто нужно в максе Pivot ориентировать по Y и нормально будет
>:)) да только анимировать будет неудобно
короче разговор можно продолжмть в аське, я стучусь
>так на сколько я помню, это просто нужно в максе Pivot ориентировать по Y и нормально будет
>:)) да только анимировать будет неудобно
>а лучше его трансформ скрутить на нужный угол
ну тут ситуация такая у меня менеджер ресурсов пытается преобретать продвинутую функциональность, поэтому я могу задать в загрузки дополнительные параметры, к примеру повернуть персонажа программно или нет? вот бы и хотелось что-бы
можно было это делать/не делать без участия 3D Studio Max, т.е. не просить моедельера первернуть модель.
>да и еще не забывай там в Cal3D обязательно calculateState(); проделывать
ну а немного поподробней?
вот тьут я перевернул Y и Z:
короче разговор можно продолжмть в аське, я стучусь
Правка: тег
Правка: 25 сен. 2006 13:14
Cal3D. Как в повернуть персонажа ? | 25 сен. 2006 | 12:49 | #3 |
---|
ns_neo_
дело в том что в некоторых редакторах в часности в 3D Studio MAX ось Z направлена вверх, а в OpenGL/Direct3D направлена вперед. поэтомк мне попадаются модели у которых первернуты координаты. Поэтому я и в загрузчике пробывал перевернуть персонажа поменяв значения координат z и y. Но этого оказалосьмало. надо еще по ходу дела менять скелет.
дело в том что в некоторых редакторах в часности в 3D Studio MAX ось Z направлена вверх, а в OpenGL/Direct3D направлена вперед. поэтомк мне попадаются модели у которых первернуты координаты. Поэтому я и в загрузчике пробывал перевернуть персонажа поменяв значения координат z и y. Но этого оказалосьмало. надо еще по ходу дела менять скелет.
Cal3D. Как в повернуть персонажа ? | 25 сен. 2006 | 11:17 | #1 |
---|
ns_neo_
Во во!!!! у меня такая-жк проблема!!!
попробывал std::swap(y, z) этого оказалось недостаточно... ;(
Во во!!!! у меня такая-жк проблема!!!
попробывал std::swap(y, z) этого оказалось недостаточно... ;(
Выбор типа анимации | 25 сен. 2006 | 10:42 | #6 |
---|
Osiris
>На сколько я знаю ( если ошибаюсь - поправьте меня пожалуйста ), MD2, MD3 форматы нельзя использовать в коммерческих >целях.
уже можно исходники Quake III открыты и форматы MD2/MD3 скорей всего оможно использовать. переделать рендер под с OpenGL под Direct3D элементарно. Вот бы еще всю геометрию загнать в единый IDirect3DVertexBuffer9 было бы совсем хорошо.
>На сколько я знаю ( если ошибаюсь - поправьте меня пожалуйста ), MD2, MD3 форматы нельзя использовать в коммерческих >целях.
уже можно исходники Quake III открыты и форматы MD2/MD3 скорей всего оможно использовать. переделать рендер под с OpenGL под Direct3D элементарно. Вот бы еще всю геометрию загнать в единый IDirect3DVertexBuffer9 было бы совсем хорошо.
Стандартный DXUTgui - интерфейс. Как изменить? | 22 сен. 2006 | 13:38 | #9 |
---|
Plastic
>Все, все сделал, если интересно, могу отписать как.
>Результат - можно делать вместо стандартного DX-интерфейса любой свой... :) ]
Я тоже все то копал текстуру выгреб и записал в файл
Ну ка поделись еще не мешало бы что-бы не зависило от API.
>Все, все сделал, если интересно, могу отписать как.
>Результат - можно делать вместо стандартного DX-интерфейса любой свой... :) ]
Я тоже все то копал текстуру выгреб и записал в файл
Ну ка поделись еще не мешало бы что-бы не зависило от API.
Perlin Noise Water | 19 сен. 2006 | 16:24 | #41 |
---|
tav
Забыл кстати
GeForce 6600
9.0 - обычная версия
30.6 - lowEnd версия
Intel Pentium 2.8 Гц
Забыл кстати
GeForce 6600
9.0 - обычная версия
30.6 - lowEnd версия
Intel Pentium 2.8 Гц
Perlin Noise Water | 19 сен. 2006 | 15:30 | #39 |
---|
tav
Ну просто супер молодец!!!
Ну просто супер молодец!!!
Зацените библиотеку | 19 сен. 2006 | 10:50 | #24 |
---|
rAvEn
ну вот я сказал чтьо ситуация с моделями Md5 изменилась:
ну вот я сказал чтьо ситуация с моделями 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); } ...