在 OpenGL 中快速绘制许多相同的对象

Draw many of the same object quickly in OpenGL

本文关键字:许多相 对象 绘制 OpenGL      更新时间:2023-10-16

所以我正在做一个游戏,我需要画很多相同的对象。相同的形状,相同的大小,相同的颜色,只是位置不同。

现在我的设置是这样的。

我有一些类Renderer,想要在屏幕上绘制的对象可以调用static void addVertex(float x, float y, float z);,它将顶点存储到std::vector中。当每个人都完成绘制static void draw();时,Renderer被称为将所有内容填充到 VBO 中并绘制到屏幕上。

绘制看起来像这样:

void Renderer::draw() {
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, _quadID);
    glBufferSubDataARB(GL_QUADS, 0, _vertexBuffer.dataSize(), _vertexBuffer.toArray());
    glColorPointer(4, GL_FLOAT, 0, _colorBuffer.toArray());
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, _vertexBuffer.toArray());
    glDrawArrays(GL_QUADS, 0, (_vertexBuffer.size() / 3));
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
    _vertexBuffer.clear();
    _colorBuffer.clear();
}

_vertexBuffer_colorBuffer属于一类template <class T> Buffer,这或多或少是我的目的的托管std::vector<T>

通过此设置,我可以在开始放慢速度之前在屏幕上显示大约 300 个内容。现在一切都是GL_QUAD。请记住,我对OpenGL有点陌生,如果以上情况令人尴尬,我很抱歉。

如何改进它以解释类似的多边形?

在~现代硬件上,实例化是要走的路。

这个想法是将几何图形发送到GPU一次(一次绘制调用(,指定要绘制的实例数(primCount参数(。

然后在顶点着色器中,您可以使用内部输入变量gl_InstanceID来了解正在渲染的实例,然后为其使用适当的转换。此方法意味着您应该在顶点着色器中提供所有实例的转换,例如在统一缓冲区对象中。

编辑:glVertexAttribDivisor函数与实例化一起非常有用;它基本上允许将一些每个顶点的属性与一些每个实例的属性一起使用。

OpenGL中有一个美丽的东西,叫做显示列表。NeHe生产有关于它们的教程,应该提供所有必要的信息和示例。但基本上:

GLuint displayList; // This should be class attribute
displayList = glGenLists(1);    
glNewList(displayList,GL_COMPILE);
Renderer::draw();
glEndList();

在实际的绘制方法中,只需:

glCallList( displayList);

不要忘记在每次添加/删除某些内容时实现预编译的显示列表。