Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL ES 2.0和OpenGL ES 3.0的单一代码_Java_Android_Opengl Es - Fatal编程技术网

Java OpenGL ES 2.0和OpenGL ES 3.0的单一代码

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

情境: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");
        ...
    }
}
但是这种方法似乎不适合调用静态方法。也许还有其他选择,比如反射或其他?谢谢大家

但这种方法似乎不适合调用静态方法

androidgles30对象是GLES20的一个子类,底层的本机API没有这样的区别,两个对象将使用相同的本机函数


我强烈怀疑这真的不重要,您可以安全地调用GLES20.glFoo来获取仅在GLES20中包含的函数和常量,它可以很好地用于GLES20和GLES30内容。

非常感谢您的回答!如果我理解正确,是否允许在项目中的任何地方使用GLES20静态函数,并且仅在着色器GLSL 1和GLSL 3的版本之间进行选择?是的,除非您确实希望使用GLES30 only函数或常量,当然,在这种情况下,您需要使用稍后的静态实例。