2013-03-13 4 views
1

Когда я делаю 2 или более экземпляра класса TestLine и добавляю его в класс рендеринга, отображается только последний. Предыдущие объекты не оказывает или исчезнутьOpengl предыдущий объект исчезает

TestLine класс:

void update(){ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glBindBuffer(GL_VERTEX_ARRAY, xbo); 
    glVertexPointer(2, GL_FLOAT, 0, 0); 

    glDrawArrays(GL_LINES, 0, verts.size()); 
    glDisableClientState(GL_VERTEX_ARRAY); 
} 

void set(float x, float y, float x2, float y2){ 
    verts.push_back(x); 
    verts.push_back(y); 
    verts.push_back(x2); 
    verts.push_back(y2); 

    glGenBuffers(1, &xbo); 
    glBindBuffer(GL_ARRAY_BUFFER, xbo); 
    glBufferData(GL_ARRAY_BUFFER, verts.size() * sizeof(GLfloat), &verts[0], GL_STATIC_DRAW); 
} 

функции в визуализации класса

void draw(){ 
    int size = lines.size(); 
    for(int i = 0; i < size; i++) 
     lines[i]->update(); 
} 
void add(TestLine* d){ 
    lines.push_back(d); 
} 
+1

Является ли это о настольном OpenGL или OpenGL ES? –

+0

Я хочу, чтобы он работал как в opengl, так и в gles1.x – tambalolo

+1

Опубликовать весь класс 'TestLine'. – genpfault

ответ

2
glBindBuffer(GL_VERTEX_ARRAY, xbo); 

GL_VERTEX_ARRAY не является веским аргументом для glBindBuffer():

target: Указывает объект, к которому привязан объект буфера. Символьная постоянная должна бытьGL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, или GL_PIXEL_UNPACK_BUFFER.

Использовать GL_ARRAY_BUFFER как в вашем другом вызове.


glDrawArrays(GL_LINES, 0, verts.size()); 

set() указывает только две вершины, а не четыре. Если verts содержал какой-то многопоточный struct (например: struct Vertex { float x, y; };) вместо необработанного float s это сработало бы.

Попробуйте это:

glDrawArrays(GL_LINES, 0, verts.size()/2); 
+0

Я занимаюсь этим целый день и даже не заметил, что GL_VERTEX_ARRAY является аргументом для glBindBuffer() .. может быть, потому что он по-прежнему отображает 1 строку. -_- Спасибо. – tambalolo

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