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

Spa*_*ace 13 c++ opengl

所以我正在开发一款游戏,我需要绘制很多相同的对象.相同的形状,相同的尺寸,相同的颜色,只是不同的位置.

现在我的设置是这样的.

我有一些类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();
}
Run Code Online (Sandbox Code Playgroud)

为了我的目的或多或少地管理的课程的地点_vertexBuffer和地点._colorBuffertemplate <class T> Bufferstd::vector<T>

通过这种设置,我可以在开始放慢速度之前在屏幕上获得大约300个内容.现在一切都是GL_QUAD.请记住,我对OpenGL有点新鲜,如果以上是令人尴尬的,我很抱歉.

我怎样才能改善这一点来解释相似的多边形?

Kos*_*Kos 21

在现代硬件上,实例化是最佳选择.

我们的想法是将几何体发送到GPU一次(一次绘制调用),指定要绘制的实例数(primCount参数).

然后在顶点着色器中,您可以使用内部输入变量gl_InstanceID来了解正在渲染的实例,然后对其使用适当的变换.这种方法意味着您应该在顶点着色器中为所有实例提供转换,例如在Uniform Buffer Object中.

编辑:该glVertexAttribDivisor功能与实例化非常有用; 它基本上允许一些每顶点属性和一些每个实例属性.