Developer.Android.comから提供されているGLES20サンプルを実行しようとすると、「Called unimplemented OpenGL ES API」エラーが発生します。ただし、サンプルを変更しました。その理由は、GLSurfaceView.BaseConfigChooser.chooseconfigでIllegalArgumentExceptionが発生したため、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 );
}
_
「Called unimplemented OpenGL ES API」エラーは、たとえば_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。
助けてくれてありがとう
AndroidアプリでOpenGL ES 2.0を有効にする必要があります。
まず、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);
}
}
NDKの場合
選択属性とコンテキスト属性のリストを確認します。
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);
この投稿を参照してください- Androidの三角形opengl
そこに述べられているように、エミュレーターはGL2をサポートしていませんが、その投稿が言及しているように、実際のデバイスでは私にとってはうまくいきました。
これはエラーではなく、ステートメントです。ターゲットがOpenGL ESバージョン2.0をサポートしていないことを通知するだけです。
レンダラー実装のonSurfaceCreated()、onSurfaceChanged()、onDrawFrame()のパラメーターとして取得しているGL10インスタンスを使用していることが原因である可能性があります。 OpenGL ES 2.0を使用する予定なので、インスタンスを使用することはできず、代わりに代替を使用します。代替案があります!これが、これらのパラメーター名と未使用または類似のコードがネット全体で見られる理由です。