использование VBO (прога на managed C++, .net)
От: Arks Россия  
Дата: 16.09.06 17:07
Оценка:
Пишу прогу на 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. С ним же ничего не рендерилось и тогда, в чём трабла ума не приложу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.