Одна пара шейдеров для нескольких объектов в OpenGL ES 2.0

#android #performance #opengl-es #shader #opengl-es-2.0

#Android #Производительность #opengl-es #шейдер #opengl-es-2.0

Вопрос:

В приложении для 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,
        false, 12, 0);
        GLES20.glUniform4fv(colorLink, 1, color, 0);
        ... // draw current 3D-object
    }
}
  

Это работает хорошо — инициализация происходит быстрее. Но у меня есть вопрос: безопасно ли использовать этот подход? Или у каждого 3D-объекта должна быть своя скомпилированная программа?

Спасибо за любой комментарий / ответ!

Ответ №1:

безопасно ли использовать этот подход? Или у каждого 3D-объекта должна быть своя скомпилированная программа?

Да, это безопасно. Вы обязательно должны продолжать делать это таким образом, это дает множество преимуществ (сокращение времени загрузки, уменьшение объема памяти, уменьшение изменений состояния сократит время кадра).