Рисую квадратами (GL_QUADS). В файле храню координаты вершин первого прямоугольника, второго и т.д.. Внешне должно выглядеть так:
2 3 5
.-------.-------.-------.
| |4 | 6 |
1 .-------.-------.-------.
| | | |
.-------.-------.-------.
Храню в файле и записываю в vbo в такой последовательности: 1, 2, 3, 4 (первый квадрат закончился), 4, 3, 5, 6 и т.д.
Для кадой вершины записываю сначала координаты вершины, потом нормаль, потом текстурные координаты
А в другой буффер записываю индексы: 0, 1, 2, 3 и т.д.
Конечно, рациональнее было бы хранить минимум вершин и использовать повторяющиеся индексы (да и рисовать с помощью gl_triangle_strip), но по идее работать то должно и так.
Рисуется почему-то только один из квадратов: с вершинами 4, 3, 5, 6.
Сначала генерирую имена буферов:
| Код |
bool InitGL(Void) { ... GLuint __pin *vboId = &vboLandscapeId; GLuint __pin *vboIndices = &vboLandscapeIndexes; DescryOGLCore::glGenBuffersARB(1,vboId); DescryOGLCore::glGenBuffersARB(1,vboIndices); ... return true; };
|
Таким вот образом заношу данные в vbo:
| Код |
bool SetLandscape(LANDSCAPE *a_landscape) { const GLuint __pin *vboId=&vboLandscapeId;
if(!OpenGLInitialized) { return false; } if(!a_landscape) { // Clear VBO DescryOGLCore::glBindBufferARB(GL_ARRAY_BUFFER_ARB,vboLandscapeId); DescryOGLCore::glBufferDataARB(GL_ARRAY_BUFFER_ARB,0,0,GL_STATIC_DRAW_ARB); // Will this free GPU memory? LandscapeIsSet = false; DescryOGLCore::glBindBufferARB(GL_ARRAY_BUFFER_ARB,0); if(Landscape) { delete Landscape; Landscape =0; } return false; } // Set VBO for new landscape if(Landscape) { delete Landscape; } Landscape=a_landscape; vboLandscapeVertexStart = 0; vboLandscapeNormalsStart = sizeof(Single)*3; vboLandscapeTexcoordsStart = vboLandscapeNormalsStart + sizeof(Single)*3; vboLandscapeVertexOffset = sizeof(Single)*8; vboLandscapeNormalsOffset = vboLandscapeVertexOffset; vboLandscapeTexcoordsOffset = vboLandscapeVertexOffset; vboLandscapeSize = vboLandscapeVertexOffset * Landscape->numberOfVertexes; DescryOGLCore::glBindBufferARB(GL_ARRAY_BUFFER_ARB,vboLandscapeId); // Choose current buffer DescryOGLCore::glBufferDataARB(GL_ARRAY_BUFFER_ARB,vboLandscapeSize,Landscape->array,GL_STATIC_DRAW_ARB); // Set buffer size & send vertexes to VBO DescryOGLCore::glBindBufferARB(GL_ARRAY_BUFFER_ARB,0); DescryOGLCore::glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,vboLandscapeIndexes); delete[] LandscapeIndexes; LandscapeIndexes=new UInt32[Landscape->numberOfVertexes]; for(Int32 i=0; i<Landscape->numberOfVertexes; i++) { LandscapeIndexes[i] = i; } Void __pin *li = &LandscapeIndexes[0]; DescryOGLCore::glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,Landscape->numberOfVertexes,li,GL_STATIC_DRAW_ARB); LandscapeIsSet = true; return true; };
|
И собственно рисование:
| Код |
Void DrawMap(Void) { if(!OpenGLInitialized) { return; } //const char __nogc *ns = (char*)vboLandscapeNormalsStart; //const char __nogc *tc = (char*)vboLandscapeTexcoordsStart;
DescryOGLCore::glBindBufferARB(GL_ARRAY_BUFFER_ARB,vboLandscapeId); glVertexPointer(3,GL_FLOAT,vboLandscapeVertexOffset,0); glNormalPointer(GL_FLOAT,vboLandscapeNormalsOffset,(char*)vboLandscapeNormalsStart); glTexCoordPointer(2,GL_FLOAT,vboLandscapeTexcoordsOffset,(char*)vboLandscapeTexcoordsStart); DescryOGLCore::glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,vboLandscapeIndexes); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawElements(GL_QUADS,Landscape->numberOfVertexes,GL_UNSIGNED_INT,0);
glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); };
|
Может кто-нибудь подскажет, что не так делаю?
Это сообщение отредактировал(а) Arks - 13.7.2006, 16:05