OpenGl - объект буфера вершин не отображается на экране - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь перейти от отображения моих GL_QUADS с помощью glBegin () к отображению их с помощью VBO.К сожалению, после моего изменения программа больше не отображает КВАДЫ.Я вижу только черный экран.Вот что я делаю:

Я определяю два VBO.Один для данных вершин, другой для индексов и выделяющий в них некоторое пространство:

glGenBuffersARB(2, pboIds);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, pboIds[0]);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 50000*sizeof(GLfloat), 0, GL_STREAM_DRAW_ARB);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, pboIds[1]);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 50000*sizeof(GLint), 0, GL_STREAM_DRAW_ARB);

Затем я отображаю их и записываю в них информацию:

float *ptr = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB);
int *ptrind = (int*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB);
int nVertexCount=0;
for (...){
    *ptr=vertX; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++;
    *ptr=vertY; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++;
    *ptr=vertZ; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++;
}
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);

Наконец, я пытаюсь отобразитьих:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawElements(GL_QUADS, nVertexCount, GL_INT, (pboIds+1));
glDisableClientState(GL_VERTEX_ARRAY);

Моя программа компилируется просто отлично.Я не получаю никаких сбоев при выполнении этого.Но все что я вижу - это черный экран.Я использую ту же процедуру для определения координат вершин, что и для glBegin (GL_QUADS).Тогда я мог видеть белые квадраты на экране.Может быть, я что-то не так делаю в своем коде VBO?

РЕДАКТИРОВАТЬ: К сожалению, я под Windows.Нужно ли что-то делать, чтобы прекратить использовать расширение ARB?У меня есть это из примера кода:

#ifdef _WIN32
PFNGLGENBUFFERSARBPROC pglGenBuffersARB = 0;
PFNGLBINDBUFFERARBPROC pglBindBufferARB = 0;
PFNGLBUFFERDATAARBPROC pglBufferDataARB = 0;
PFNGLBUFFERSUBDATAARBPROC pglBufferSubDataARB = 0;
PFNGLDELETEBUFFERSARBPROC pglDeleteBuffersARB = 0;
PFNGLGETBUFFERPARAMETERIVARBPROC pglGetBufferParameterivARB = 0;
PFNGLMAPBUFFERARBPROC pglMapBufferARB = 0;
PFNGLUNMAPBUFFERARBPROC pglUnmapBufferARB = 0;
#define glGenBuffersARB           pglGenBuffersARB
#define glBindBufferARB           pglBindBufferARB
#define glBufferDataARB           pglBufferDataARB
#define glBufferSubDataARB        pglBufferSubDataARB
#define glDeleteBuffersARB        pglDeleteBuffersARB
#define glGetBufferParameterivARB pglGetBufferParameterivARB  
#define glMapBufferARB            pglMapBufferARB
#define glUnmapBufferARB          pglUnmapBufferARB
#endif

1 Ответ

2 голосов
/ 03 октября 2011

glDrawElements (GL_QUADS, nVertexCount, GL_INT, (pboIds + 1));

Вы не передаете имя объекта буфера этой функции.Он использует любой объект буфера, связанный с GL_ELEMENT_ARRAY_BUFFER в то время.Это значение является смещением от начала буфера;он указывает, где находится первый индекс.

Кроме того, прекратите использование версии буфера ARB-расширений.Просто используйте основной материал.


К сожалению, я нахожусь под Windows.

Я не понимаю, какое отношение это имеет к этому.Используйте загрузочную библиотеку OpenGL , если вы не можете сделать это самостоятельно .

...