问题描述
在android应用程序中有许多简单的相似3D对象。为了使初始化过程不会花费很长时间,对于所有对象,我都使用一对着色器(一个链接程序),例如:
public class SceneRenderer implements GLSurfaceView.Renderer {
private final int NUMBER = 400;
private Object3D[] objects = new Object3D[NUMBER];
@Override
public void onSurfaceCreated(GL10 gl,EGLConfig config {
LinkedProgram program = new LinkedProgram(vShader,fShader);
int programObject = program.get();
...
for (int i = 0; i < NUMBER; i++) {
// use one program for all objects
objects[i] = new Object3D(programObject);
}
}
...
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,VBO[0]);
for (int i = 0; i < NUMBER; i++) {
objects[i].draw(); // draw all objects
}
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,0);
}
}
每个3D对象都使用相同的编译程序:
public class Object3D {
...
public Object3D(int programObject) {
this.programObject = programObject;
mvpMatrixLink = GLES20.glGetUniformLocation(programObject,"mvp_matrix");
colorLink = GLES20.glGetUniformLocation(programObject,"v_color");
positionLink = GLES20.glGetAttribLocation(programObject,"a_position");
}
public draw() {
GLES20.glUseProgram(programObject);
GLES20.glUniformMatrix4fv(mvpMatrixLink,1,false,mvpMatrix,0);
GLES20.glEnableVertexAttribArray(positionLink);
GLES20.glVertexAttribPointer(positionLink,3,GLES20.GL_FLOAT,12,0);
GLES20.glUniform4fv(colorLink,color,0);
... // draw current 3D-object
}
}
这很好用-初始化速度更快。但是我有一个问题:使用这种方法是否安全?还是每个3D对象都应该有自己的编译程序?
感谢您的任何评论/答案!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)