OpenGL ES 2.0 中用于多个对象的一对着色器
One pair of shaders for several objects in 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 对象都应该有自己的编译程序?
感谢您的任何 comment/answer!
is it safe to use this approach? Or should each 3D-object have its own compiled program?
是的,很安全。您绝对应该继续这样做,这样做有很多好处(减少加载时间、减少内存占用、减少状态更改将减少帧时间)。
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 对象都应该有自己的编译程序?
感谢您的任何 comment/answer!
is it safe to use this approach? Or should each 3D-object have its own compiled program?
是的,很安全。您绝对应该继续这样做,这样做有很多好处(减少加载时间、减少内存占用、减少状态更改将减少帧时间)。