我在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++;
}
提前致谢!!!
答案 0 :(得分:1)
如果更改的数据是位置和旋转,那么您应该更新到着色器。
在CPU处理大多数矩阵内容很慢,除非所需的操作很小,比如计算新的视图和投影矩阵,对所有对象都是一样的,并且它们作为均匀取值
对于每一帧,我都可以在RewriteCond
或BufferData
的帮助下重新填充glMapBufferRange
新的位置和轮换。
然后,在着色器中,构建所需的矩阵并在那里进行矩阵乘法运算。
如果需要初始位置和旋转来构建新矩阵,那么你还必须在另一个缓冲区中传递它们,尽管只是为第一帧更新它。
使用正确的属性顺序,您可以在着色器中读取这些位置和旋转。 glBufferSubData
微积分不需要gl_InstanceID
,也许其他对象属性可能需要{。}}。
如果您需要有关如何在着色器中构建矩阵的帮助,请在OpenGL 2.1 docs中查找gl_Position
和glRotate
,您可以在其中找到定义。< / p>
另请注意,glTranslate
为所有对象传递大矩阵可能会超出整个统一数据大小的限制。