C++ 如何渲染大量相似对象?
我有大量的物体(至少10000个粒子),比如三角形、正方形、圆形或球体。实际上,现在我有一个对象,我渲染了很多次。看起来是这样的:C++ 如何渲染大量相似对象?,c++,opengl,C++,Opengl,我有大量的物体(至少10000个粒子),比如三角形、正方形、圆形或球体。实际上,现在我有一个对象,我渲染了很多次。看起来是这样的: for (int i=0; i<totalParticleCount; i++) { drawObject->pos = hState[i].pos; drawObject->draw(vp); } 我发现我的渲染过程太慢了。如何提高渲染性能?如何有效地使用opengl渲染类似对象?通常,对于任何类型的优化问题,首先要确定的是瓶颈
for (int i=0; i<totalParticleCount; i++) {
drawObject->pos = hState[i].pos;
drawObject->draw(vp);
}
我发现我的渲染过程太慢了。如何提高渲染性能?如何有效地使用opengl渲染类似对象?通常,对于任何类型的优化问题,首先要确定的是瓶颈在哪里。如果瓶颈是着色器的复杂性,那么CPU端的优化是无用的。然而,正如您提到的10000个draw调用,这是相当过分的,我将假设您是CPU受限的 所以首要任务是减少抽签电话的数量。 目前,您似乎通过10000次绘制调用实现了10000个粒子 通常,在执行粒子系统时,所有粒子都渲染为面向屏幕的四边形(广告牌),并使用单个纹理图集应用纹理,我的目标是在一次绘制调用中渲染所有10000个粒子 你描述了一个稍微复杂一点的场景;三角形、正方形和圆圈都可以在一个单索引的三角形列表中分批排列,尽管也许你应该考虑把你的圆圈作为纹理四边形来代替三角形。 球体有点不同,因为它是一个相对复杂的高多边形对象。如果它真的不能被模拟成一个广告牌,那么你最好研究一下实例化技术,一次画出所有的球体
粒子系统听起来不错,但我的模型更复杂。我的模型是流体,我使用CUDA来更新粒子的状态。我可以将所有形状打包到一个VBO中。在这种情况下,我可以为每个形状设置模型矩阵吗?或者VBO的每个顶点都与系统中心有相对位置?选项1和3-4看起来像我要找的选项。我的着色器非常简单。例如,这是顶点着色器:
void main()。我认为批处理可以帮助我解决问题。
void Circle::draw(const glm::mat4 &vp) {
glUseProgram(programId);
glUniformMatrix4fv(matrixId, 1, GL_FALSE, &(vp * getModelMatrix(pos, scale))[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLE_FAN, 0, vertexNumber);
glDisableVertexAttribArray(0);
}