Android: GLES20: называется не реализованным API OpenGL ES
При попытке получить образец GL ES20, предоставленный developer.android.com, я получаю сообщение об ошибке "Называется нереализованный API OpenGL ES". Я изменил образец, хотя. Причина в том, что я получил IllegalArgumentException в GLSurfaceView.BaseConfigChooser.chooseconfig, поэтому я заменил mGLSurfaceView.setEGLContextClientVersion( 2 );
Новый OnCreateMethod:
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
mGLSurfaceView = new GLSurfaceView( this );
mGLSurfaceView.setEGLConfigChooser( new EGLConfigChooser()
{
@Override
public EGLConfig chooseConfig( EGL10 egl, EGLDisplay display )
{
EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
boolean check = false;
int[] configSpec = { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE };
check = egl.eglInitialize( display, new int[] { 2, 0 } );
if ( !check )
return null;
check = false;
check = egl.eglChooseConfig( display, configSpec, configs, 1, num_config );
if ( !check )
return null;
return configs[0];
}
} );
mGLSurfaceView.setEGLContextFactory( new EGLContextFactory()
{
@Override
public void destroyContext( EGL10 egl, EGLDisplay display, EGLContext context )
{
egl.eglDestroyContext( display, context );
}
@Override
public EGLContext createContext( EGL10 egl, EGLDisplay display, EGLConfig eglConfig )
{
int[] attrib_list = new int[]{EGL10.EGL_VERSION, 2, EGL10.EGL_NONE};
EGLContext context = egl.eglCreateContext( display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list );
return context;
}
});
mGLSurfaceView.setRenderer( new GLES20TriangleRenderer( this ) );
setContentView( mGLSurfaceView );
}
Ошибка "Вызывается невыполненный API OpenGL ES", например, в GLES20.glCreateShader;
или же GLES20.glShaderSource
,
Я подумал, может быть, чтобы проверить версию, поэтому я позвонил gl.glGetString( GLES20.GL_VERSION );
в public void onSurfaceCreated( GL10 gl, EGLConfig config )
, glGetString вернул "OpenGL ES-CM 1.0". OnSurfaceCreated вызывается после выбора конфигурации и создания контекста, поэтому я действительно не понимаю, почему glGetString возвращает "OpenGL ES-CM 1.0".
Я использую Android 2.2 API и попробовал пример на виртуальном устройстве Android 2.2 и на HTC Wildfire с Android 2.2.1.
Я ценю любую помощь
4 ответа
Вам необходимо включить OpenGL ES 2.0 в вашем приложении для Android.
Во-первых, в вашем AndroidManifest.xml убедитесь, что у вас есть следующее:
<uses-feature android:glEsVersion="0x00020000"></uses-feature>
<uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"></uses-sdk>
Во-вторых, создайте подкласс GLSurfaceView следующим образом:
public class CustomView extends GLSurfaceView {
final CustomRenderer renderer;
CustomView(Context context) {
super(context);
setEGLContextClientVersion(2); // This is the important line
renderer = new CustomRenderer();
setRenderer(renderer);
}
}
ДЛЯ НДК
Убедитесь, что вы выбрали атрибуты и списки атрибутов контекста:
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
eglChooseConfig(dpy, attribs, &config, 1, &numConfigs);
const EGLint ContextAttribList[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
context = eglCreateContext(GLapp.dpy, config, EGL_NO_CONTEXT, ContextAttribList);
Смотрите этот пост - треугольник OpenGL в Android
Как уже упоминалось, эмуляторы не поддерживают GL2, но, как упоминается в этом посте, он работал для меня на реальном устройстве.
Это не ошибка, а утверждение. Он просто говорит вам, что ваша цель не поддерживает OpenGL ES версии 2.0.
Это может быть из-за того, что вы используете экземпляр GL10, который мы получаем в качестве параметра в onSurfaceCreated(), onSurfaceChanged() и onDrawFrame() в вашей реализации Renderer. Поскольку вы намереваетесь использовать OpenGL ES 2.0, мы можем и, вероятно, не будем использовать этот экземпляр и использовать вместо него альтернативу. Есть альтернативы! По этой причине мы видим эти имена параметров и неиспользуемые или похожие в кодах по всей сети!