微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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,12,0);
        GLES20.gluniform4fv(colorLink,color,0);
        ... // draw current 3D-object
    }
}

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

感谢您的任何评论/答案!

解决方法

使用这种方法安全吗?还是每个3D对象都应该有自己的编译程序?

是的,这很安全。您应该绝对继续这样做,这样做有很多好处(减少加载时间,减少内存占用,减少状态更改将减少帧时间)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。