簡體   English   中英

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)似乎不太適合調用靜態方法。 也許還有其他選擇,例如反思或其他? 謝謝你們。

但是這種方法似乎不太適合調用靜態方法 GLES。

而Android GLES30對象是類的子類GLES20 ,和底層本地API不作這樣的區分,並且在同一本地函數將被用於兩者。

我強烈懷疑這真的無關緊要,您可以安全地為僅在GLES20的函數和常量調用GLES20.glFoo() ,它對GLES20GLES30內容都可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM