gpt4 book ai didi

java - OpenGL ES 2.0 和 OpenGL ES 3.0 的单一代码

转载 作者:行者123 更新时间:2023-12-02 09:04:11 25 4
gpt4 key购买 nike

情况: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.

Android GLES30 对象是 GLES20 的子类,底层 native API 不会做出这样的区分,并且两者将使用相同的 native 函数。

我强烈怀疑这真的不重要,您可以安全地调用 GLES20.glFoo() 来获取仅在 GLES20 中的函数和常量,并且它会起作用适用于 GLES20GLES30 内容。

关于java - OpenGL ES 2.0 和 OpenGL ES 3.0 的单一代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59960084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com