Пишу прогу на mc++. Использую ogl расширение vbo: GL_ARRAY_BUFFER_ARB GL_ELEMENT_ARRAY_BUFFER_ARB. Считываю информацию из файла и записываю в vbo в следующем формате: координаты вершины (x,y,z); координаты нормали к вершине (x,y,z); текстурные координаты (x,y) Всё имеет тип Single (float). Рисуются прямоугольники. | Код | bool SetLandscape(LANDSCAPE *a_landscape) { const GLuint __pin *vboId=&vboLandscapeId; ... glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); Landscape=a_landscape; delete[] LandscapeIndexes; // Сортировка по текстурам - работает корректно, проверено. Landscape->SortByTextures(); LandscapeIndexes = new UInt32[Landscape->numberOfVertexes]; // Записываю индексы (т.к. рисую всё, то индексов столько сколько вершин) - всё верно тут? ????? for(Int32 i=0; i < Landscape->numberOfVertexes; i++) { LandscapeIndexes[i] = i; } // Устанавливаю смещения vboLandscapeVertexStart = 0; vboLandscapeNormalsStart = sizeof(Single)*3; vboLandscapeTexcoordsStart = vboLandscapeNormalsStart + vboLandscapeNormalsStart; 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); Void __pin *li = &LandscapeIndexes[0]; DescryOGLCore::glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,Landscape->numberOfVertexes,li,GL_STATIC_DRAW_ARB); LandscapeIsSet = true; return true; };
|
Эти три функции вызываю однократно при первом рендеринге: glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); Тукстурированные прямоугольники вывожу так: | Код | Void DrawMap(Void) { UInt32 index, count, j, tmp; ... // Биндю буфферы, устанавливаю указатели DescryOGLCore::glBindBufferARB(GL_ARRAY_BUFFER_ARB,vboLandscapeId); glVertexPointer(3,GL_FLOAT,vboLandscapeVertexOffset,(GLvoid*)vboLandscapeVertexStart); glNormalPointer(GL_FLOAT,vboLandscapeNormalsOffset,(GLvoid*)vboLandscapeNormalsStart); glTexCoordPointer(2,GL_FLOAT,vboLandscapeTexcoordsOffset,(GLvoid*)vboLandscapeTexcoordsStart); DescryOGLCore::glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,vboLandscapeIndexes);
j = 0; tmp = Landscape->numberOfTextures; for(UInt32 i=0; i < tmp; i++) // Теперь рисуем все прямоугольники с первой текстурой, далее со 2ой и т.д. { index = j; // Номер первого ПРЯМОУГОЛЬНИКА с текущей текстурой do{ ++j; }while(j < tmp && Landscape->land[j].texture==Landscape->land[j+1].texture); ++j; // Теперь j равно номеру первого прямоугольника со следующей текстурой count = j - index; // Вычисляем количество прям.-в с текущей текстурой // Вычисляем смещение к певой вершине с данной текстурой Void __pin *li = (Void *)(index*vboLandscapeTexcoordsOffset+vboLandscapeTexcoordsStart); glBindTexture(GL_TEXTURE_2D,Landscape->texture[i]); // Выбрать текстуру glDrawElements(GL_QUADS,count,GL_UNSIGNED_INT,li); // Рендеринг } }; };
|
В коде выше я подписал, как должно всё это выполняться с моей точки зрения. Возможно где-то ошибся... Очень надеюсь на помощь, бьюсь над этой проблемой уже чёрте сколько, пол инета в поисках любой полезной инфы перерыл, но пока ничего не работает И ещё: Без текстурирования прямоугольники выводились, но только в том случае, если я НЕ использовал GL_ELEMENT_ARRAY_BUFFER_ARB. С ним же ничего не рендерилось и тогда, в чём трабла ума не приложу.
|