在 OpenGL 中快速绘制许多相同的对象
Draw many of the same object quickly in 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();
}
_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);
不要忘记在每次添加/删除某些内容时实现预编译的显示列表。
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 当两个 std::map 对象相同时
- 在C++中,系统如何将这些对象中的每一个与执行程序的窗口相关联?
- 动态分配许多 Boost::直方图对象
- 视觉 在C++中,我试图在没有递归的情况下循环访问许多对象
- 如何确保将对象通过许多层的组件时,不会制作副本
- 使用指针将两个对象(每个都与一个类)相关联
- 将 ETW 文件对象与 DiskIO 事件相关联
- 许多立方体对象的 OpenGL 绘图元素
- 如何处理C 游戏中的许多对象
- Winapi-如何组织许多HWND对象
- 返回相交点和对象相交
- 使用许多小部件设置UI对象
- 为什么在分配/解除分配许多小对象后内存不可重用
- C++:如何让函数接受来自任何命名空间的具有相同类名的对象
- 如何在运行时获取许多对象之一的句柄
- 访问本地对象(相同类类型)的私有成员
- 在 OpenGL 中快速绘制许多相同的对象
- 在C++中定义许多组合对象的最佳方法
- 是否strand和io对象(如tcp::socket)需要担心相关联的io_service的生命周期?