Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> opengl vbo - рисуется не вся сцена, программа под .net 
:(
    Опции темы
Arks
  Дата 13.7.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Рисую квадратами (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
PM MAIL ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0379 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.