2016-06-27 6 views
-1

私はいくつかのシェーダを読み込み、公式NDKを使ってアンドロイドGLSurfaceViewとC++でhello world triangleをレンダリングしようとしています。しかし、私はエラー "現在のコンテキストなしでOpenGL ES APIを呼び出す"を取得します。ここに私の単純な単一のファイルjavaはgoogle's tutorialからサイドコンテキスト作成コード(これはプロジェクト全体で唯一のJavaコードであることに注意)です:NDKを使うどれもAndroid gln現在のコンテキスト

class GLESRenderer implements GLSurfaceView.Renderer 
{ 
    static { 
     System.loadLibrary("native_code"); 
    } 
    private native void ntInit(); 
    private native void ntRender(); 
    private native void ntUpdateScreen(int width, int height); 

    public void onSurfaceCreated(GL10 unused, EGLConfig config) { 
     ntInit(); // LOAD SHADERS AND VBO DATA!!!! 
    } 

    public void onDrawFrame(GL10 unused) { 
     ntRender(); // DRAW USING SHADERS AND VBO DATA!!!! 
    } 

    public void onSurfaceChanged(GL10 unused, int width, int height) { 
     ntUpdateScreen(width, height); // UPDATE SCREEN!!! 
    } 
} 

class GLES_SurfaceView extends GLSurfaceView { 

    private final GLESRenderer mRenderer; 

    public GLES_SurfaceView(Context context){ 
     super(context); 
     setEGLContextClientVersion(2); 
     mRenderer = new GLESRenderer(); 
     setRenderer(mRenderer); 
    } 
} 

public class Main extends Activity { 

    private GLSurfaceView mGLView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mGLView = new GLES_SurfaceView(this); 

     if(Build.VERSION.SDK_INT < 16) { 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     } else { 
      View decorView = getWindow().getDecorView(); 
      decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 

      ActionBar bar = getActionBar(); 
      if(bar != null) 
       bar.hide(); 
     } 
     setContentView(mGLView); 
    } 
} 

他の多くのスタックオーバーフローに関する質問(ので、彼らはありますおそらく異なる問題)は、これがスレッドの問題であることを示唆していますが、このコードはGLSurfaceView.Rendererのネイティブ関数を明示的に呼び出しているため、これはスレッドの問題ではないと確信しています。

さらに、複数のチュートリアルでは、openglとNDKを使用してレンダリングするのと同じアプローチを使用しています。たとえば、Intel's tutorial、およびlearnopengles's tutorialです。

したがって、私は

+0

私の投稿をdownvoteしようとしている場合、私は私の質問を改善する方法についてのいくつかのフィードバックを残してみませんか?私はこの話題を自分の能力の最大限に徹底的に研究しました。寝袋に入れないでください。 – Jas

+1

コードからエラーが発生していることを確認しましたか?私は、これらのエラーメッセージは、あなたが行った呼び出しに何のつながりもなくログに表示されることがあり、無害であると思います。問題を絞り込むために、私は透明色を黒以外に設定し、Javaコードに 'glClear()'呼び出しを入れます。これにより、コンテキストの作成が正常に行われたことが確認されます。 –

+0

@RetoKoradiはい私はプロジェクトのndk側でglClearColorsを使ってglClearを実行しましたが、それは完璧に実行されました!だから多分あなたは正しいです、そして、それはちょうど役に立たないエラーであり、私の問題は他のところにあります。チップをありがとう、他の部分を調べる。 – Jas

答えて

0

はこの質問に答えることを忘れ、私のコンテキスト作成中に何か問題があると思います。この問題は、C++のデフォルトコンストラクタシステムのために発生しました。私のOpenGLコンテキストが作成される前に、私は "native_code"ライブラリをロードしていました。しかし、私のネイティブのシェーダクラスには、デフォルトのコンストラクタが用意されていて、OpenGLを呼び出して初期化しました。

class LightingShader 
{ 
    LightingShader() 
    { 
     glCreateShader(...) // BAD TO CALL OPENGL HERE WITHOUT CONTEXT CREATED 
     .... 
    } 
}; 

.... 
LightingShader light_shader; // <- GLOBAL VARIABLE, DEFAULT CONSTRUCTOR CALLED!!!! 

基本的にそれらのライブラリがロードされたとき、C++シェーダは自動的にコンストラクタを呼び出していました。 OpenGLが初期化される前に、このライブラリが呼び出されました!私は、デフォルトコンストラクタを削除し、代わりに、代わりにオブジェクトを返した関数を使用してこれを固定:

class LightingShader 
{ 
    LightingShader getLightingShaderInstance() 
    { 
     glCreateShader(...) 
     .... 
    } 
}; 

したがって、それは私の一部に不良のオブジェクト指向設計の中に隠さ卑劣なバグでした。

関連する問題