2011-01-13 2 views
3

У меня есть рутина дро полностью работает следующим образом:glDrawArrays проблема

glEnable(GL_TEXTURE_2D); 
glMatrixMode(GL_MODELVIEW); 
{ 
    glBindTexture(GL_TEXTURE_2D, [texture name]); 
    GLsizei stride = sizeof(quads[0].tl); 

    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 

    glBufferData(GL_ARRAY_BUFFER, sizeof(TQuad2D), quads, GL_STATIC_DRAW); 
    glVertexPointer(2, GL_FLOAT, stride, (void *)offsetof(TVertex2D, pos)); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glTexCoordPointer(2, GL_FLOAT, stride, (void *)offsetof(TVertex2D, tex)); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 


    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
} 

glBindTexture(GL_TEXTURE_2D, 0); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 

И ни до, ни после того, как выше, я хочу, чтобы нарисовать простую линию, например, как показано ниже. Это само по себе прекрасно работает, но если я объединю его с описанной выше процедурой, это даст мне ошибку 506, которая равна GL_INVALID_FRAMEBUFFER_OPERATION.

GLfloat verts[4]; 
verts[0] = 0; 
verts[1] = 0; 
verts[2] = 600; 
verts[3] = 600; 

glColor4f(0.0f,1.0f,0.0f,1.0f); 
glVertexPointer(2, GL_FLOAT, 0, &verts); 
glEnableClientState(GL_VERTEX_ARRAY); 
glDrawArrays(GL_LINES, 0, 2); 
glDisableClientState(GL_VERTEX_ARRAY); 
GLErrCheck(@"err"); 

Возможно, я забыл сбросить некоторые состояния GL, но я не могу понять это.

ответ

2

Ваше предположение о том, чтобы забыть сбросить некоторые состояния, является правильным. Пока буфер привязан к GL_ARRAY_BUFFER, последний параметр glVertexPointer и аналогичные функции интерпретируется как смещение в этот буфер, а не как обычный указатель, такой как &verts. Вы можете сбросить его, позвонив по телефону

glBindBuffer(GL_ARRAY_BUFFER, 0) 

в конце вашего первого фрагмента кода.

+0

Спасибо за объяснение. Это именно то, что происходило! – Morrowless

Смежные вопросы