2012-01-06 10 views
6

hello-gl2のOpenGLコードを組み込むために、ネイティブアクティビティのNDKサンプルを調整しました。私はAPP_CMD_INIT_WINDOWメッセージを処理してから、シェーダの作成を試みます。シェーダの作成が失敗し、getShaderInfoivを使用して情報を取得しようとしましたが、それも黙って失敗します。NativeActivityでOpenGLシェーダを作成する

私の質問は、どうすれば純粋なネイティブAndroidアプリケーションでOpenGL ES 2.0シェーダを作成できますか?

P.S. Java GLSurfaceViewを使用して正しいスレッドで作成しないで、ネイティブアクティビティのサンプルを見ると、シェイダーの作成が失敗することはありますが、スレッドは1つしかないようです。

+0

おそらく役に立たない質問を申し訳ありませんが、何らかの形でEGLを初期化しましたか? OpenGLエンジンはあなたの要求を受け取る準備が整っていないと思う(getShaderInfoiv呼び出しの静かな失敗を説明できる)。 OGL 2.0ライブラリがロードされていますか? –

+0

こんにちは、はいEGLが初期化されました –

+0

ネイティブOpenGL開発での経験がないので、次のネイティブアクティビティの例でOpenGL ES 1.0コンテキストを残すと思います。 hello-gl2の例では、OpenGL ES 2.0の設定はJavaコード内で行われます。 – harism

答えて

12

ネイティブAndroidアプリケーションでOpenGL ES 2.0シェーダを作成することは可能です。重要なことは、適切なOpenGL ES 2.0コンテキストを使用することです。私はアプリで似たようなことをしました。つまり、ネイティブ部分のEGLコンテキストを初期化し、ネイティブコードでのみシェーダを作成(および使用)しました。私が管理していたことに基づいて、私はあなたがしたいことが完全に可能であると仮定します。

私はJavaコード(NativeAcvityメカニズムを使用していない)のエントリポイントを持っていたので、ネイティブコードでEGLサーフェスを作成するために、ネイティブウィンドウハンドル(EGLNativeWindowType)をjavaからC++に渡さなければなりませんでした。ただし、NativeActivityの例を単純に変更する場合は、NativeActivity main.cサンプルで示されているように、engine->app->windowを使用してEGLサーフェスを作成することができます。

OK、ネイティブコードで適切なOpenGL ES 2.0コンテキストを作成するにはどうすればよいですか?私はNativeActivityサンプルのmain.cファイルに2つの変更を加え、それが機能することを確認しました。

まず、以下のEGLはeglChooseConfig(display, attribs, &config, 1, &numConfigs);

const EGLint attribs[] = { 
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //important 
EGL_BLUE_SIZE, 8, 
EGL_GREEN_SIZE, 8, 
EGL_RED_SIZE, 8, 
EGL_NONE 
}; 

属性用います。

は第二に、後context = eglCreateContext(display, config, NULL, attrib_list);

const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; 

を使用するコンテキストを作成する際に、私は不変コードの残りの部分を残しました。私は、OpenGL ES 2.0が使用されていることを確認するためにいくつかの情報を印刷しました:

I/native-activity( 955): Details: [Version: OpenGL ES 2.0 1403843], [Vendor: Qualcomm], [Renderer: Adreno 205], [Extensions: GL_AMD_compressed_3DC_texture GL_AMD_compressed_ATC_texture ... ] 

希望します!

+0

ありがとうございます - それは私が探しているものとまったく同じです。私が家に帰ると、私は確認します。 –

+0

これらの2つの変更はそれを釘付けにした。ありがとう! –

+1

私は助けることができてうれしいです!私はあまりにも遅れて答えを書いて、私が賞金を手に入れなかったことは残念です。 – youri

3

あなたは完全なネイティブソリューションに進むことに決めたのでしょうか?通常は、レンダリングエンジン、AIエンジン、物理エンジンなどの「重いコンポーネント」だけを「ネイティブ」に保つことです。 "デバイス層"はJava部分までです。

このように、大きな利点は移植性です。 NDKのすべてをビルドする場合は、ゲーム/プログラムをIphoneに移動したい場合はホイールを再作成する必要がありますが、CのコアとJavaの追加のレイヤーを保持する場合は、問題の簡単な部分。

私の3Dエンジン(PATRIA 3D)は、Android NDKからIphone Objective C(Windows/Linux/Mac OSx)に移植できるネイティブコードで構築されているので、豊富な経験があります。その日の終わりに、私のコードはAndroid(アンドロイドndk-buildを使用)とIphone(XCODE)を使用してコンパイルできるようになりました(マイナーチェンジで)完全準拠のC89 + OpenGL2.0です。

このアプローチに従って、エンジンと同じスレッドで実際の描画を実行し、それをメインスレッドと呼ぶことにします。

、あなたのアプリケーションで複数のスレッドが必要な場合:

A - (メイン)メイン1に描画してください B - Cでそれをしない、Javaで新しいスレッドを作成します(あなたを新しいレイヤにマルチスレッドを構築する)

シェーダに関しては、OpenGLのサーフェスとinitが標準のEGLライブラリを使用してJavaによって実行されるため、このような解決策は非常に前向きです。

AndroidとiPhoneの両方のプラットフォームで一度書き込んで使うことができれば、あなたは無視することができないもので、あなたの収益を2倍にする可能性があります。

これは何らかの形で役立ちます。

+0

これは非常に良い投稿と思われますが、マルチスレッドを使用できるC++ 11を使用すれば、完全なネイティブソリューションを使用することができますか?私はJavaインターフェイス(私はJavaですべてのテクスチャを置く)とC + +のパーソナルエンジンを使用しているので、それはきちんとしていません。 – Sung

関連する問題