我正在准备一些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();
}
}
你能否澄清一下:“但是当我在第一帧中有更多的缓冲区时,所有这些缓冲区都会显示出来,然后只有最后一个画出来”可见一点?也许显示更多的代码? –
@VictorSand完成。 – JoshuaBehrens
不错。所以,如果我正确地理解了这一点:你正在并行绘制几个东西(几个缓冲区)(到同一帧),但只显示最后绘制的对象? –