Android OpenGL ES 2.0中多个对象的一对着色器

Android OpenGL ES 2.0中多个对象的一对着色器,android,performance,opengl-es,shader,opengl-es-2.0,Android,Performance,Opengl Es,Shader,Opengl Es 2.0,android应用程序中有许多简单的类似3D对象。因此,初始化不会花费很长时间,对于所有对象,我使用了一对着色器(一个链接程序),如: 这很有效-初始化速度更快。但我有一个问题:使用这种方法安全吗?或者每个3D对象都应该有自己的编译程序 感谢您的评论/回答 使用这种方法安全吗?或者每个3D对象都应该有自己的编译程序 是的,很安全。您绝对应该继续这样做,这样做有多个好处(减少加载时间、减少内存占用、减少状态更改将减少帧时间) public class SceneRenderer implement

android应用程序中有许多简单的类似3D对象。因此,初始化不会花费很长时间,对于所有对象,我使用了一对着色器(一个链接程序),如:

这很有效-初始化速度更快。但我有一个问题:使用这种方法安全吗?或者每个3D对象都应该有自己的编译程序

感谢您的评论/回答

使用这种方法安全吗?或者每个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);
    }
}
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,
        false, 12, 0);
        GLES20.glUniform4fv(colorLink, 1, color, 0);
        ... // draw current 3D-object
    }
}