[英]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.