2011-05-08 4 views
20

developer.android.comから提供されているGLES20サンプルを試すときに、 "実装されていないOpenGL ES APIと呼ばれました"というエラーが表示されます。私はサンプルを修正しました。私はGLSurfaceView.BaseConfigChooser.chooseconfigで、IllegalArgumentExceptionを得た ので 理由があったので、私は新しいOnCreateMethod mGLSurfaceView.setEGLContextClientVersion(2);Android:GLES20:実装されていないOpenGL ES APIと呼ばれる

を置き換える: "と呼ばれる未実装のOpenGL ESのAPI" エラーがで例えば発生

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); 
} 

GLES20.glCreateShader;またはGLES20.glShaderSource

gl.glGetString(GLES20.GL_VERSION);public void onSurfaceCreated(GL10 gl, EGLConfig config)に、私は考えていたかもしれません。 glGetStringから "OpenGL ES-CM 1.0"が返されました。 OnSurfaceCreatedはconfigを選択してコンテキストを作成した後に呼び出されるので、実際にはわかりません。なぜなら、なぜglGetStringが "OpenGL ES-CM 1.0"を返すのかです。

私はAndroid 2.2 APIを使用しており、Android 2.2仮想デバイスとAndroid 2.2.1搭載のHTC Wildfireでサンプルを試しました。

私は、これはエラーが、文ではありません

+1

私はGL ES 1.1/2.0にあまり経験はありませんが、AFAIKを非常にうまく実装していないエミュレータをよく知っている方が良いです。そして、デバイス上で動作するがエミュレータでは動作しないコードで終わることができます。 – harism

答えて

1

任意の助けに感謝。ターゲットがOpenGL ESバージョン2.0をサポートしていないことを単に伝えます。

+0

それは論理的に聞こえるよ。 HTC WildfireはOpenGL ES 1.0のみをサポートしています。だから私は、仮想デバイスはOpenGL ES 2.0をサポートしていないと仮定することができます。ご協力いただきありがとうございます。 – Coolkill

41

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のサブクラスを作成:NDK

FOR

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); 
    } 
} 

あなたが属性とコンテキストを選択していることを確認してくださいributeリスト:

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); 
+10

ありがとう!これは、NDKで書かれたアプリでも機能します。その場合、等価な第2のステップは、EGL_CONTEXT_CLIENT_VERSIONを2に設定して属性リストを作成し、次にeglCreateContext()に渡すことです。 – scorpiodawg

+0

@トレヴァー、それは私のために働かなかった。あなたは助けてもらえますか?私は 'setEGLContextClientVersion(2);'メソッドからエラーを受け取ります:ここでは[アクティビティ](https://gist.github.com/doctordoder/7494621)です。ここに私の[レンダラ](https: //gist.github.com/doctordoder/7494625)、ここに私の[マニフェスト](https://gist.github.com/doctordoder/7494625)があります。私は 'javax.microedition.khronos 'を使用していることに気付くでしょう。私のIDE(intellij IDEA)がインポートした後でもそれを使用させないので、普通の 'EGLConfig'の代わりに' egl.EGLConfig'を使用しています。助けてくれてありがとう! – michaelsnowden

+0

元の問題を再読しました...残念ながら、WildfireはOGL ES 2をサポートしていません(GPUはありません)ので、別のデバイスが必要です。 – Trevor

2

この記事を参照してください - triangle opengl in android

が述べたように、エミュレータはGL2をサポートしていませんが、そのポストは言及して、それが実際のデバイス上で私のために働きました。

0

これは、Renderer実装のonSurfaceCreated()、onSurfaceChanged()およびonDrawFrame()のパラメータとして取得しているGL10インスタンスを使用している可能性があります。 OpwnGL ES 2.0を使うつもりなので、おそらくインスタンスを使用することはできませんし、代わりに代わりの方法を使用することもできます。代替案があります!これが、ネット上のコードでこれらのパラメータ名と未使用または類似のものが表示される理由です。

関連する問題