- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用 PowerVR G6200 GPU 的设备上,例如 Sony Xperia M5 (E5603) 和小米红米 Note 3 (hennessy),创建用于使用 OpenGL ES 2 进行渲染的 EGL 上下文失败,而它在我测试过的所有其他设备上都能正常工作:
java.lang.RuntimeException:
at android.opengl.GLSurfaceView$EglHelper.throwEglException (GLSurfaceView.java:1233)
at android.opengl.GLSurfaceView$EglHelper.throwEglException (GLSurfaceView.java:1224)
at android.opengl.GLSurfaceView$EglHelper.start (GLSurfaceView.java:1074)
at android.opengl.GLSurfaceView$GLThread.guardedRun (GLSurfaceView.java:1447)
at android.opengl.GLSurfaceView$GLThread.run (GLSurfaceView.java:1286)
配置选择器是这样实现的:
class CustomEGLConfigChooser implements GLSurfaceView.EGLConfigChooser {
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
EGLConfig [] configs = new EGLConfig[1];
int [] num_config = new int[1];
int [] attrib_list = new int[] {
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_ALPHA_SIZE, 8,
EGL10.EGL_DEPTH_SIZE, 24,
EGL10.EGL_STENCIL_SIZE, 8,
EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT,
EGL10.EGL_NONE,
};
boolean res = egl.eglChooseConfig(display, attrib_list, configs, configs.length, num_config);
if (res && num_config[0] > 0) {
return configs[0];
}
return null;
}
}
配置选择器从 GLSurfaceView
子类中使用,如下所示:
public class GameView extends GLSurfaceView {
public GameView (Context context, ClientConfig clientConfig) {
super(context);
setEGLContextClientVersion(2);
setEGLConfigChooser(new CustomEGLConfigChooser());
}
}
最佳答案
通过比较此代码工作的设备 ( Nexus 5x EGL configs ) 和非工作设备 ( Xiaomi Redmi Note 3 EGL configs ) 上的 EGL 配置列表,我发现虽然有匹配的配置,但它们在一个属性上有所不同,即EGL_RENDERABLE_TYPE
。
第一个匹配的 Nexus 5x EGL 配置:
EGL_CONFIG_ID: 11
[...]
EGL_ALPHA_SIZE: 8
EGL_BLUE_SIZE: 8
EGL_GREEN_SIZE: 8
EGL_RED_SIZE: 8
EGL_DEPTH_SIZE: 24
EGL_STENCIL_SIZE: 8
[...]
EGL_RENDERABLE_TYPE: OpenGL_ES OpenGL_ES_2 (5)
首先匹配的小米红米Note 3 EGL配置:
EGL_CONFIG_ID: 1
[...]
EGL_ALPHA_SIZE: 8
EGL_BLUE_SIZE: 8
EGL_GREEN_SIZE: 8
EGL_RED_SIZE: 8
EGL_DEPTH_SIZE: 24
EGL_STENCIL_SIZE: 8
[...]
EGL_RENDERABLE_TYPE: OpenGL_ES (1)
请注意,Nexus 5x 支持 EGL_RENDERABLE_TYPE
和 EGL_OPENGL_ES2_BIT
(此外还支持具有相同配置的 EGL_OPENGL_ES_BIT
),所以我们只是幸运的是,现有设备上的所有配置恰好都支持这两种可渲染类型。
小米红米Note 3还有一个支持ES2渲染类型的配置,但这并不是第一个匹配的配置:
EGL_CONFIG_ID: 23
[...]
EGL_ALPHA_SIZE: 8
EGL_BLUE_SIZE: 8
EGL_GREEN_SIZE: 8
EGL_RED_SIZE: 8
EGL_DEPTH_SIZE: 24
EGL_STENCIL_SIZE: 8
[...]
EGL_RENDERABLE_TYPE: OpenGL_ES_2 (4)
尝试将第一个(配置 ID 1)与 ES2 渲染上下文一起使用显然行不通,因为该配置不支持 ES2 渲染。解决方法是像这样显式请求可呈现类型作为 EGL 配置选择器的一部分,修改问题中的示例,如下所示:
int [] attrib_list = new int[] {
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_ALPHA_SIZE, 8,
EGL10.EGL_DEPTH_SIZE, 24,
EGL10.EGL_STENCIL_SIZE, 8,
EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT,
EGL10.EGL_RENDERABLE_TYPE, EGL10. EGL_OPENGL_ES2_BIT,
EGL10.EGL_NONE,
};
请注意,在只需要请求 RGBA + 深度/模板值的情况下,另一种选择是使用 setEGLConfigChooser(int, int, int, int, int, int)而不是自定义实现,这将负责根据 setEGLContextClientVersion()
中设置的值请求 EGL_RENDERABLE_TYPE
。
关于PowerVR G6200 上带有 EGLConfigChooser 的 java.lang.RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46690615/
在使用 PowerVR G6200 GPU 的设备上,例如 Sony Xperia M5 (E5603) 和小米红米 Note 3 (hennessy),创建用于使用 OpenGL ES 2 进行渲染
我是一名优秀的程序员,十分优秀!