簡體   English   中英

Android:如何將此應用程序從 GLES1 移植到 GLES3

[英]Android: How can I port this app from GLES1 to GLES3

我的任務是將 android 應用程序從 GLES1 轉換為 GLES3。 該應用程序在 JNI 中執行所有 OpenGL 調用,在線程中運行,並調用 Java 以運行基本功能,例如:

InitOpenGL();
MakeContextCurrent();
GLSwapBuffer();

該應用程序維護自己的時鍾等 - 所以基本上應用程序的主循環看起來像這樣(簡化)。

JavaBridge->InitOpenGL();
while (stillRunning())
{
   SleepUntilRightTime();
   UpdateEverything();
   if (shouldDraw())
   {
      JavaBridge->MakeContextCurrent();
      DrawEverything();
      JavaBridge->GLSwapBuffers();
   }
}

因此,為了實現這一點,應用程序有自己的 OpenGL 工廠,它初始化 OpenGL1.1。 為了簡潔起見,我將嘗試刪除所有不必要的內容,這里是基礎知識(刪除了所有錯誤檢查以保持簡短):

public class GLView extends SurfaceView implements SurfaceHolder.Callback
{
   EGL10 m_GL;
   EGLContext m_GLContext;
   EGLDisplay m_GLDisplay=null;
   EGLSurface m_GLSurface=null;
   EGLConfig m_GLConfig=null;
   
   public void InitOpenGL()
   {
      m_GL = (EGL10) EGLContext.getEGL();
      m_GLDisplay = m_GL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
      m_GL.eglInitialize(m_GLDisplay, null);
      EGLConfig[] configs = new EGLConfig[1];
      int[] config_count = new int[1];
      int[] specs = { EGL10.EGL_ALPHA_SIZE, 8, EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_STENCIL_SIZE, 8, EGL10.EGL_NONE };
      m_GL.eglChooseConfig(m_GLDisplay, specs, configs, 1, config_count);
      m_GLContext = m_GL.eglCreateContext(m_GLDisplay, m_GLConfig, EGL10.EGL_NO_CONTEXT, null);
      SurfaceHolder h = getHolder();
      m_GLSurface = m_GL.eglCreateWindowSurface(m_GLDisplay, m_GLConfig, h, null);
      m_GL.eglMakeCurrent(m_GLDisplay, m_GLSurface, m_GLSurface, m_GLContext);
      m_GL = (EGL10) EGLContext.getEGL();
   } 
   public void MakeContextCurrent() 
   {
      m_GL.eglMakeCurrent(m_GLDisplay, m_GLSurface, m_GLSurface,    m_GLContext);
   }
   public void SwapBuffers() 
   {
      m_GL.eglSwapBuffers(m_GLDisplay, m_GLSurface);
   }
}

這一切都很好,應用程序在其線程中運行並在它認為合適的時候繪制屏幕(這是一個游戲,順便說一句,這就是為什么不斷循環)。

現在:我希望將其轉換為 OpenGL3.0 上下文,我只想說“嘿,請求版本號”或類似的東西。 我嘗試了一些沒有成功的事情(使用 createcontext 在屬性列表中設置 GL_VERSION,確保鏈接正確的庫,固定清單等,等等),但無論我做什么,openGL 在 JNI 中調用要么什么都不做,要么讓程序崩潰。

我什至不能讓 glClear 工作,除非我把所有東西都恢復到第一格。 有人有什么建議可以將這個東西變成一個支持 3.0 的上下文嗎?

好的,設法解決了這個問題。 對於使用現代 android 的任何人,您會發現未定義 EG10.EGL_CONTEXT_CLIENT_VERSION。 似乎使用 EGL_VERSION 可以替代,但事實並非如此。

為什么沒有定義 EGL_CONTEXT_CLIENT_VERSION? 是不是貶值了? 被回避了嗎? 我們永遠不會知道。 但我們確實知道,如果它被定義,它將是 0x3098。

所以,讓這一切神奇地工作就像說:

        int[] attrib_list=new int[]{0x3098,3,EGL10.EGL_NONE};
        m_GLContext = m_GL.eglCreateContext(m_GLDisplay, m_GLConfig, EGL10.EGL_NO_CONTEXT,attrib_list);

這樣做有危險嗎? 大概。 我會做更多的研究。 如果我再也沒有回來編輯這個,那么我找不到真正的答案是或否。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM