OpenGL ES:处理大量的matrixdata提高性能

时间:2017-10-25 14:43:49

标签: performance opengl-es frame-rate opengl-es-3.0

我在OpenGL-app中使用实例化,因为只有一个drawcall,我必须计算一个由较小矩阵组成的较大矩阵,并且较大的矩阵被发送到着色器,其中gl_InstanceID可以区分连续矩阵。

通过以下电话将其放在公交车上

GLES30.glUniformMatrix4fv(mMVPMatrixHandleBall, nBalls, false, mMVPMatrixMajor, 0);

并在着色器中由

进行乘法运算
gl_Position =  u_MVPMatrix[gl_InstanceID] * a_Position;

简单!

在客户端,通过以下代码创建更大的矩阵:

 private void setLargeMVPmatrix() {

    int cnt = 0;
    for (Iterator<Ball> shapeIterator = arrayListBalls.iterator(); shapeIterator.hasNext(); ) {

        Ball ball = shapeIterator.next();

        mModelMatrix = ball.getmModelMatrix();

        //multipl.
        Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
        //subst. in matrisdata i en större vektor dvs vi får en stor matris som innehhåller flera mindre matriser
        for (int i = 0; i < CreateGLContext.MATRIX_SIZE; i++) {

            mMVPMatrixMajor[i + CreateGLContext.MATRIX_SIZE * cnt] = mMVPMatrix[i];
        }
        cnt++;
    }
}

如果我在屏幕上有移动物体,比如弹跳球,例如100个球在它周围弹跳意味着我必须不断地将每个帧的位置平移,这反过来意味着我必须每帧都调用这个方法。结果是它成为一个真正的性能bottelneck。我知道这只是通过评论方法只是为了看看发生了什么 - 以及真正的性能提升,但球当然不会再移动了。

所以我的问题 - 这个问题有解决方案吗?如果我使用实例化,我必须根据上面发送一个大矩阵。

编辑:

我甚至尝试了以下内容,我认为至少可以部分解决我的问题。在drawMethod中:

  int cnt = 0;
    for (Iterator <Ball> it = arrayListBalls.iterator(); it.hasNext();) {

        Ball ball = it.next();
        mModelMatrix = ball.getmModelMatrix();

        //multipl.
        Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
        GLES30.glUniformMatrix4fv( (mMVPMatrixHandleBall + cnt), 1, false, mMVPMatrix, 0);
        cnt++;
    }

提前致谢!!!

1 个答案:

答案 0 :(得分:1)

如果更改的数据是位置和旋转,那么您应该更新到着色器。

在CPU处理大多数矩阵内容很慢,除非所需的操作很小,比如计算新的视图和投影矩阵,对所有对象都是一样的,并且它们作为均匀取值

对于每一帧,我都可以在RewriteCondBufferData的帮助下重新填充glMapBufferRange新的位置和轮换。
然后,在着色器中,构建所需的矩阵并在那里进行矩阵乘法运算。

如果需要初始位置和旋转来构建新矩阵,那么你还必须在另一个缓冲区中传递它们,尽管只是为第一帧更新它。

使用正确的属性顺序,您可以在着色器中读取这些位置和旋转。 glBufferSubData微积分不需要gl_InstanceID,也许其他对象属性可能需要{。}}。

如果您需要有关如何在着色器中构建矩阵的帮助,请在OpenGL 2.1 docs中查找gl_PositionglRotate,您可以在其中找到定义。< / p>

另请注意,glTranslate为所有对象传递大矩阵可能会超出整个统一数据大小的限制。