2013-04-09 4 views
0

Я пытаюсь сделать рельеф с высоты. В настоящее время я загружаю карту высот и могу визуализировать ее с помощью вершинных массивов с glBegin/glEnd, но мне нужно сделать это с помощью VBOs. Поскольку я использую Qt, предлагаемым методом является QGLBuffer.Как отрегулировать ландшафт с помощью объектов буфера Vertex в Qt?

Что я делаю неправильно? vboV - это QGLBuffer, который я инициализирую внутри функции initializeGL().

void GLWidget::initializeGL() 
{ 
glEnable(GL_DEPTH_TEST); 
glMatrixMode(GL_MODELVIEW); 
glClearColor(0,0,0,0); 

vboV=new QGLBuffer(QGLBuffer::VertexBuffer); 
vboV->create(); 
vboV->bind(); 
vboV->setUsagePattern(QGLBuffer::StaticDraw); 
vboV->allocate(img->height()*img->width()*18); 
vboV->release(); 
} 

void GLWidget::paintGL() 
{ 

//the commented section is using vertex array which works fine 
// glEnableClientState(GL_VERTEX_ARRAY); 
// glEnableClientState(GL_COLOR_ARRAY); 

// glVertexPointer(3,GL_FLOAT,0,f); 
// glColorPointer(3,GL_FLOAT,0,colorf); 
// glDrawArrays(GL_TRIANGLES,0,img->height()*img->width()*6); 

// glDisableClientState(GL_COLOR_ARRAY); 
// glDisableClientState(GL_VERTEX_ARRAY); 

vboV->bind(); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3,GL_FLOAT,0,f); 
glDrawArrays(GL_TRIANGLES,0,img->height()*img->width()); 
glDisableClientState(GL_VERTEX_ARRAY); 
vboV->release(); 
} 

Я не уверен, что изменить, чтобы заставить его работать. Программа работает, но ландшафт не отображается (он просто черный).

f представляет собой массив поплавков, который содержит {x1, y1, z1, x2, y2, z2 ...}; позиции вершин, которые устанавливаются против часовой стрелки. Я не знаю, правильно ли распределена память, и я уверен в glDrawArrays.

Я использую Qt 4.8.1 и моя ОС Windows 7

+0

Правильно ли вы устанавливаете цвета вершин? – Chris

+1

Где вы загружаете данные VBO? Где-то, надеюсь, есть призыв к 'glBufferData' или тому подобное. – radical7

+0

Я не устанавливаю цвета вершин. И я не знаю, как загрузить данные в этот буфер, нет функции glBufferData с QGLBuffer. –

ответ

0

Вы должны добавить

vboV->write(0, img->data(), img->width() * img->height() * 18); 

Или вы просто использовать перегруженный метод выделения:

vboV->allocate(img->data(), img->height() * img->width() * 18); 

Конечно, вам нужно изменить img->data() в зависимости от вашего типа данных img.