有效地绘制动态对象
Efficiently draw dynamic objects
在OpenGL上绘制动态移动对象的最佳方法是什么?
目前,我是这样做的:我有一个类Actor
,在其中构造函数我生成一个缓冲区:
Actor::Actor(float x, float y): xpos(x),
ypos(y),
width(1),
height(1) {
glGenBuffers(1, &buffer);
}
所有其他处理都在每一帧:
中完成for(auto const &a: actors) {
float x = (a.xpos / tiles_x) * 2 - 1.0f + (1 / tiles_x);
float y = -((a.ypos / tiles_y) * 2 - 1.0f + (1 / tiles_y));
float w = a.width / (tiles_x);
float h = a.height / (tiles_y);
const GLfloat vertex[] {
x - w, y - h, 1.0f,
x - w, y + h, 1.0f,
x + w, y + h, 1.0f,
x - w, y - h, 1.0f,
x + w, y - h, 1.0f,
x + w, y + h, 1.0f,
};
glBindBuffer(GL_ARRAY_BUFFER, a.buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,
3,
GL_FLOAT,
GL_FALSE,
0,
(void*)0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
}
我不是OpenGL专家,但对我来说它似乎相当低效。难道没有其他更有效的方法吗?
不推荐使用glTransform。更好的方法是使用着色器。
你真的不需要每帧发送所有的顶点到gpu。你的假设是正确的,它是低效的。当你创建你的演员,你创建网格一次,并发送所有的顶点到显卡。然后每个绘制帧,你所要做的就是绑定缓冲区并调用glDrawArrays。像这样。
要应用转换,你发送x,y,z偏移到顶点着色器,并将其与顶点相乘。这个网站提供了一些关于如何使用未被弃用的opengl功能来做到这一点的优秀教程。
如果你以相同的方式变换顶点,你只传递4x4变换矩阵的统一变量,这是每帧重新计算。
如果你需要独立地改变顶点,那么你必须改变属性数组并在每一帧中上传它,但是你应该考虑使用选项GL_DYNAMIC_DRAW
。请参阅bufferData -用法参数差异了解更多信息。
相关文章:
- C++中的动态对象与非动态对象
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 生成文件:动态源文件名和对象目录
- 我们可以通过 IPC 传递具有动态管理成员的类对象吗?
- 使用动态实例化的对象填充矢量的快速方法
- 如何在 Cheerp/js 中迭代动态命名的对象?
- 销毁C++中动态分配的内存(数组对象)
- 创建动态对象并将其推送到矢量中
- 删除包含包含动态对象的 STL 容器的智能指针
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何访问对象动态数组中的私有成员变量?
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- Cython 中对象动态大小的数组
- malloc分配的对象动态类型是什么
- C++按属性排序的对象动态数组
- visual C++新与Malloc的对象动态内存阵列