【发布时间】:2018-07-17 16:49:30
【问题描述】:
我有 170 个对象要绘制,每个对象都是由 312 个顶点构建的。 我有一个对象,我用不同的矩阵绘制了 170 次,我发现如果我一个一个地绘制它们,我不需要调用一些函数,所以我只在开始时调用它们,这给了我大约 5fps,我我正在使用带有 drawArrays 的非索引三角形。
if(!started)
{
glUseProgram( __programObject );
glEnableVertexAttribArray(attPosition);
glVertexAttribPointer(attPosition, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), vVertices);//3*sizeof(float)
glEnableVertexAttribArray(attNormals);
glVertexAttribPointer(attNormals, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), vNormals);//3*sizeof(float)
}
在 es 2.0 下有什么方法可以让它更快吗?我在 sgx 540 上得到大约 23fps, 将每个对象的顶点细节降低到 36 个不会增加帧速率,矩阵计算(缩放、乘法、平移、转置、反转)大约有 10fps,但它们是在 cpu 上制作的,我认为将它们移动到着色器中并不是一个好主意。我知道大部分时间都花在每次传递制服上。我知道有一种方法可以实例化对象并传递制服并在一次调用中绘制它,但我找不到任何描述它的教程,你知道我在哪里可以找到它吗?
【问题讨论】:
-
使用带有交错数据的单个 VBO 应该会有很大帮助。一些 GPU 也更喜欢 16 的步幅。
-
遗憾的是,
gl_ext_draw_instanced和gl_ext_instanced_arrays在 SGX540 上不可用,仅在 SGX543、544、554(所谓的 5XT 系列 as distinct from 5 系列)上可用。