2016-06-27 75 views
-1

我試圖加載一些着色器和渲染的機器人GLSurfaceView和C++使用官方NDK一個Hello World三角形。但是,我收到錯誤「調用OpenGL ES API沒有當前上下文」。這是我簡單的單個文件的Java(注意,這是在整個項目中唯一的Java代碼)從google's tutorial端環境創建代碼:的Android GL沒有當前上下文

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

許多其他的堆棧溢出問題(其中沒有使用NDK,所以他們是可能是不同的問題)表明這是一個線程問題,但是這段代碼明確地調用了GLSurfaceView.Renderer的本地函數,所以我非常肯定這不是線程問題。

此外,多個教程使用相同的方法使用opengl和NDK進行渲染。例如:Intel's tutoriallearnopengles's tutorial

因此,我認爲我的上下文創建有問題

+0

如果您打算冷靜地發表我的文章,爲什麼不留下一些關於如何改進我的問題的反饋?盡我所能,我已經清楚地研究了這個話題。不要成爲沖涼袋。 – Jas

+1

您是否確認錯誤來自您的代碼?我認爲這些錯誤消息有時會顯示在日誌中,而不會與您所做的任何連接相關聯,並且可能是無害的。爲了縮小問題的範圍,我將清晰的顏色設置爲黑色以外的其他顏色,並在Java代碼中放入一個'glClear()'調用。這將確認上下文創建工作。 –

+0

@RetoKoradi是的,我已經在我的項目的ndk端運行glClear和不同的glClearColors,並且它運行完美!所以也許你是對的,這只是一個無用的錯誤而我的問題在於別處。謝謝你的提示,我會調查其他部分。 – 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(...) 
     .... 
    } 
}; 

因此,這是一個錯誤偷偷摸摸隱藏在壞的面向對象設計我的一部分。

相關問題