2013-05-27 21 views
1

我正在准备一些2f顶点,2f texvertices和4f颜色的缓冲区。它显示正确。整个事情在一个班上。如果我有更多的实例(每个生成它自己的缓冲区ID,从来没有传入一个函数,所以它没有被清理,只是在第一次绘制期间包装成指针在std :: list中)(第一次绘制使用gdb后暂停,我看到所有缓冲的东西)所有缓冲数据都是可见的。在下一个绘图中,只有最后绘制的缓冲区是可见的。GL缓冲区设置为GL_STATIC_DRAW,但需要发送每帧

glBufferData(GL_ARRAY_BUFFER, Size * 8 * sizeof(float), f, GL_STATIC_DRAW); 

其中尺寸是一个std ::为size_t与顶点的数量和f浮子阵:

我通过生成,绑定,然后用与该呼叫数据填充所述缓冲器准备。要绘制缓冲区,我将其绑定,激活客户端状态:GL_VERTEX_ARRAY,GL_TEXTURE_COORD_ARRAY,GL_COLOR_ARRAY。

glDrawArrays(Mode, 0, Size); 

其中模式是GL_TRIANGLES的GLenum。

我通过在glDrawArrays每帧之前调用glBufferData来修复它,但这不是它应该如此。它应该是生成,绑定,填充,然后通过绑定和调用glDrawArrays进行绘制,不是吗?

如有必要:我正在使用C++,在Windows 7 x64上使用gcc。 有人问我更多的代码:

void Buffer::CopyToGPU() 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, Object); 
    float* f = new float[ Size * 8 ]; 
    for (std::size_t s(0) ; s < Size ; ++s) 
     CopyVertexToFloatArray(&f[ s * 8 ], Vortex[ s ]); 
    glBufferData(GL_ARRAY_BUFFER, Size * 8 * sizeof(float), f, GL_STATIC_DRAW); 
    delete[] f; 

    glVertexPointer(2, GL_FLOAT, 8 * sizeof(float), NULL); 
    glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(float), (char*)(2 * sizeof(float))); 
    glColorPointer(4, GL_FLOAT, 8 * sizeof(float), (char*)(4 * sizeof(float))); 
} 
void Buffer::Render() 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, Object); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    //Actually draw the triangle, giving the number of vertices provided 
    glDrawArrays(Mode, 0, Size); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
} 
int main(...) // stripped buffer sfml2 initialization etc. 
{ 
    glClearColor(0, 0, 0, 1); 

    glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_GREATER , 0.1); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    while (win.isOpen()) // sf::Window 
    { 
     /// draw 
     glClear(GL_COLOR_BUFFER_BIT); 
     MVP.Apply(); 
     CallDraw(); 
     win.display(); 
    } 
} 
+0

你能否澄清一下:“但是当我在第一帧中有更多的缓冲区时,所有这些缓冲区都会显示出来,然后只有最后一个画出来”可见一点?也许显示更多的代码? –

+0

@VictorSand完成。 – JoshuaBehrens

+0

不错。所以,如果我正确地理解了这一点:你正在并行绘制几个东西(几个缓冲区)(到同一帧),但只显示最后绘制的对象? –

回答

2

你似乎在更新缓冲区对象指定ATTRIB指针。这不是它的工作原理。顶点attrib指针(取决于GL版本)是全局状态还是每个VAO状态,但绝不是每个VBO状态。目前,当你做这样的事情

bufferA.CopyToGPU(); 
bufferB.CopyToGPU(); 
while(true) { 
    bufferA.render(); 
    bufferB.render(); 
} 

专用缓冲器B将被使用,因为顶点数组状态设置为(留下潜在的出OUF界,你认为你使用缓冲渲染当它访问)缓冲区B在第二次调用中,覆盖第一次调用中设置的任何attrib指针。您需要在绘制每个对象时重新指定指针,或者使用顶点数组对象来封装这些指针。请注意,GL> = 3.X核心配置文件后面的路径是强制性的。