Пишу прогу на 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. С ним же ничего не рендерилось и тогда, в чём трабла ума не приложу.