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