【发布时间】:2014-06-09 20:31:41
【问题描述】:
我正在使用 OpenGL、glew 和 GLFW 为一个项目编写一个简单的游戏。我已经有一个使用 Assimp 的 3D 模型导入器,它也可以处理纹理。
这是我绘制一个网格的方式:
glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[NORMAL_VB]);
glNormalPointer(GL_FLOAT, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[TEXCOORD_VB]);
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[POS_VB]);
glVertexPointer(3, GL_FLOAT, 0, NULL);
//Render the triangles
glDrawArrays(GL_TRIANGLES, 0, m_Entries[i].NumIndices);
我的问题是如何使用同一个网格渲染数百个移动实体,但每个实体都有不同的世界位置和旋转?
如果我有数百个移动实体,每一帧我都会渲染相同的网格数百次,我现在可以注意到 FPS 下降了。
顺便说一句,我没有使用着色器,只是简单的绘制
【问题讨论】:
-
这就是顶点着色器和实例化的用途。问题是因为您使用的是
glVertexPointer (...)等。我真的不知道您使用的是什么版本的GL;实例化在 GL 3.1 中被提升为核心,但此代码可能与 GL 1.5 一样古老。您能否提及您使用什么版本的 GL 来简化编写答案? -
@AndonM.Coleman,其实我真的不知道我在用什么版本,但它可能是最后一个,我不知道
-
@AndonM.Coleman,我仍在使用很多旧的和已弃用的函数
-
嗯,你在使用着色器吗?这是一个很好的起点。即使没有 GL 的支持,您也可以使用一些技术进行实例化,但它们至少需要顶点着色器。
-
@AndonM.Coleman:我同意这一点。通过使用着色器并学习如何编写它们(尤其是顶点着色器),他会对他的问题有一个自然的答案。 (只需在统一缓冲区中设置新的世界矩阵后发出多个绘制调用)
标签: opengl mesh glew 3d-modelling