Java OpenGL ES 2.0和OpenGL ES 3.0的单一代码
情境:Android应用程序支持OpenGL ES的两个版本:2.0和3.0。差异仅在着色器中存在。我不想为版本2和版本3创建单独的类集,但希望合并它们。也就是说,不是两个类似的类别:Java OpenGL ES 2.0和OpenGL ES 3.0的单一代码,java,android,opengl-es,Java,Android,Opengl Es,情境:Android应用程序支持OpenGL ES的两个版本:2.0和3.0。差异仅在着色器中存在。我不想为版本2和版本3创建单独的类集,但希望合并它们。也就是说,不是两个类似的类别: import android.opengl.GLES20; class ObjectGLES20 { public ObjectGLES20() { ... // invoke static methods from GLES20 int positionL
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");
...
}
}
但是这种方法似乎不适合调用静态方法。也许还有其他选择,比如反射或其他?谢谢大家
但这种方法似乎不适合调用静态方法
androidgles30对象是GLES20的一个子类,底层的本机API没有这样的区别,两个对象将使用相同的本机函数
我强烈怀疑这真的不重要,您可以安全地调用GLES20.glFoo来获取仅在GLES20中包含的函数和常量,它可以很好地用于GLES20和GLES30内容。非常感谢您的回答!如果我理解正确,是否允许在项目中的任何地方使用GLES20静态函数,并且仅在着色器GLSL 1和GLSL 3的版本之间进行选择?是的,除非您确实希望使用GLES30 only函数或常量,当然,在这种情况下,您需要使用稍后的静态实例。