OpenGL ES 2.0 和 OpenGL ES 3.0 的单一代码
Single code for OpenGL ES 2.0 and OpenGL ES 3.0
情况:Android应用程序支持两个版本的 OpenGL ES:2.0 和 3.0。差异仅在着色器中。我不想为第 2 版和第 3 版制作单独的 类 集,但想合并它们。即代替两个相似的类:
import android.opengl.GLES20;
class ObjectGLES20 {
public ObjectGLES20() {
...
// invoke static methods from GLES20
int positionLink = GLES20.glGetAttribLocation(programObject, "a_position");
int lightPositionLink = GLES20.glGetUniformLocation(programObject, "u_lightPosition");
...
}
}
import android.opengl.GLES30;
class ObjectGLES30 {
public ObjectGLES30() {
...
// invoke static methods from GLES30
int positionLink = GLES30.glGetAttribLocation(programObject, "a_position");
int lightPositionLink = GLES30.glGetUniformLocation(programObject, "u_lightPosition");
...
}
}
做这样的事情:
// define supported version OpenGL ES
if (getVersionGLES() >= 3.0 && Build.VERSION.SDK_INT >= 18) {
objectAll = new ObjectAll(new GLES30(), true) // use polymorphism
} else objectAll = new ObjectAll(new GLES20(), false)
...
/** @param gles - instance of GLES20 or GLES30 */
class ObjectAll {
public ObjectAll(GLES20 gles, boolean isSupportGLES30) {
String pathToVertexShader;
String pathToFragmentShader;
if (isSupportGLES30) {
pathToVertexShader = "shaders/gles30/vertex_shader.glsl";
pathToFragmentShader = "shaders/gles30/fragment_shader.glsl";
} else {
pathToVertexShader = "shaders/gles20/vertex_shader.glsl";
pathToFragmentShader = "shaders/gles20/fragment_shader.glsl";
}
int programObject = linkProgram(pathToVertexShader, pathToFragmentShader);
...
// invoke static methods from GLES20 or GLES30 depending on supported version
// TIP!: static member accessed via instance reference
int positionLink = gles.glGetAttribLocation(programObject, "a_position");
int lightPositionLink = gles.glGetUniformLocation(programObject,
"u_lightPosition");
...
}
}
但是这种方法(创建实例GLES)似乎不适合调用静态方法。也许还有其他选择,例如反射或其他?谢谢大家
But this approach seems not good for calling static methods GLES.
AndroidGLES30
对象是GLES20
的子类,底层nativeAPI不做这样的区分,相同的native函数会是用于两者。
我强烈怀疑这真的无关紧要,您可以安全地为 GLES20
中的函数和常量调用 GLES20.glFoo()
,它对 GLES20
都可以正常工作和 GLES30
内容。
情况:Android应用程序支持两个版本的 OpenGL ES:2.0 和 3.0。差异仅在着色器中。我不想为第 2 版和第 3 版制作单独的 类 集,但想合并它们。即代替两个相似的类:
import android.opengl.GLES20;
class ObjectGLES20 {
public ObjectGLES20() {
...
// invoke static methods from GLES20
int positionLink = GLES20.glGetAttribLocation(programObject, "a_position");
int lightPositionLink = GLES20.glGetUniformLocation(programObject, "u_lightPosition");
...
}
}
import android.opengl.GLES30;
class ObjectGLES30 {
public ObjectGLES30() {
...
// invoke static methods from GLES30
int positionLink = GLES30.glGetAttribLocation(programObject, "a_position");
int lightPositionLink = GLES30.glGetUniformLocation(programObject, "u_lightPosition");
...
}
}
做这样的事情:
// define supported version OpenGL ES
if (getVersionGLES() >= 3.0 && Build.VERSION.SDK_INT >= 18) {
objectAll = new ObjectAll(new GLES30(), true) // use polymorphism
} else objectAll = new ObjectAll(new GLES20(), false)
...
/** @param gles - instance of GLES20 or GLES30 */
class ObjectAll {
public ObjectAll(GLES20 gles, boolean isSupportGLES30) {
String pathToVertexShader;
String pathToFragmentShader;
if (isSupportGLES30) {
pathToVertexShader = "shaders/gles30/vertex_shader.glsl";
pathToFragmentShader = "shaders/gles30/fragment_shader.glsl";
} else {
pathToVertexShader = "shaders/gles20/vertex_shader.glsl";
pathToFragmentShader = "shaders/gles20/fragment_shader.glsl";
}
int programObject = linkProgram(pathToVertexShader, pathToFragmentShader);
...
// invoke static methods from GLES20 or GLES30 depending on supported version
// TIP!: static member accessed via instance reference
int positionLink = gles.glGetAttribLocation(programObject, "a_position");
int lightPositionLink = gles.glGetUniformLocation(programObject,
"u_lightPosition");
...
}
}
但是这种方法(创建实例GLES)似乎不适合调用静态方法。也许还有其他选择,例如反射或其他?谢谢大家
But this approach seems not good for calling static methods GLES.
AndroidGLES30
对象是GLES20
的子类,底层nativeAPI不做这样的区分,相同的native函数会是用于两者。
我强烈怀疑这真的无关紧要,您可以安全地为 GLES20
中的函数和常量调用 GLES20.glFoo()
,它对 GLES20
都可以正常工作和 GLES30
内容。