如何在 EGL 或 GLSurfaceView 中设置 OpenGL 版本?

发布于 2024-12-14 14:17:35 字数 422 浏览 1 评论 0原文

对于我正在处理的 OpenGL Android 项目,我需要 ES 2.0,但我需要对渲染缓冲区/表面的控制,我习惯于使用 EGL 来实现。因为我无法找出使用 GLSurfaceView 渲染到屏幕外缓冲区的任何方法,然后从不显示缓冲区。即使我使用 GLSurfaceView.EGLContextFactory,如果没有 Android EGL 包中未包含的 EGL 1.2 函数/常量(例如 EGL_CONTEXT_CLIENT_VERSION),我也想不出任何方法来完成此任务。

因此,第一个明显的问题是:有没有办法 1) 尽管省略了 EGL_CONTEXT_CLIENT_VERSION 和 eglBindAPI(),但仍将 EGL 与 ES 2.0 一起使用? 2)是否有一些新的API用于设置在调用GLSurfaceView的回调surfaceCreated(EGLConfig)之前使用的渲染上下文?

For the OpenGL Android project I am working on, I need ES 2.0, but I need the control of rendering buffers/surfaces I am accustomed to achieving by using EGL. For I cannot figure out any way to render to an offscreen buffer using GLSurfaceView, and then never displaying the buffer. Even if I use GLSurfaceView.EGLContextFactory, I cannot think of any way to accomplish this without EGL 1.2 functions/constants not included in Android's EGL package (e.g. EGL_CONTEXT_CLIENT_VERSION).

So the first obvious question is: is there a way to either 1) use EGL with ES 2.0 despite the omission of EGL_CONTEXT_CLIENT_VERSION and of eglBindAPI()? 2) is there some new API for setting the rendering context used before GLSurfaceView's callback surfaceCreated(EGLConfig) is called?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

放手` 2024-12-21 14:17:35

如果您可以使用默认的 EGLContextFactory 和 EGLConfigChooser,则可以使用 setEGLContextClientVersion() GLSurfaceView 的 方法。

否则,如果您正在编写自己的 EGLContextFactoryEGLConfigChooser,自己定义常量即可。在配置选择器中,定义

private static final int EGL_OPENGL_ES2_BIT = 4;

然后将其作为 EGL_RENDERABLE_TYPE 的值与您想要的其他属性一起传递给 eglChooseConfig:

int attribs[] = {
    EGL10.EGL_RED_SIZE,   mRedSize,
    EGL10.EGL_GREEN_SIZE, mGreenSize,
    EGL10.EGL_BLUE_SIZE,  mBlueSize,
    EGL10.EGL_ALPHA_SIZE, mAlphaSize,
    EGL10.EGL_DEPTH_SIZE, mDepthSize,
    EGL10.EGL_SAMPLE_BUFFERS, mSampleBuffers,
    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL10.EGL_NONE
};

对于上下文工厂,

private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;

在创建上下文时定义并使用它:

public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) 
{
  int[] attrib_list = {
    EGL_CONTEXT_CLIENT_VERSION, 2,
    EGL10.EGL_NONE 
  };

  EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);

  return context;
}

当您编写这些内容时,将它们传递给 setEGLContextFactorysetEGLConfigChooser 分别。

If you can live with the default EGLContextFactory and EGLConfigChooser, you can use the setEGLContextClientVersion() method of the GLSurfaceView.

Otherwise, if you're writing your own EGLContextFactory and EGLConfigChooser, just define the constants yourself. In the config chooser, define

private static final int EGL_OPENGL_ES2_BIT = 4;

then pass this as the value for EGL_RENDERABLE_TYPE to eglChooseConfig, together with other attributes you desire:

int attribs[] = {
    EGL10.EGL_RED_SIZE,   mRedSize,
    EGL10.EGL_GREEN_SIZE, mGreenSize,
    EGL10.EGL_BLUE_SIZE,  mBlueSize,
    EGL10.EGL_ALPHA_SIZE, mAlphaSize,
    EGL10.EGL_DEPTH_SIZE, mDepthSize,
    EGL10.EGL_SAMPLE_BUFFERS, mSampleBuffers,
    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL10.EGL_NONE
};

For the context factory, define

private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;

and use this when creating a context:

public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) 
{
  int[] attrib_list = {
    EGL_CONTEXT_CLIENT_VERSION, 2,
    EGL10.EGL_NONE 
  };

  EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);

  return context;
}

When you've written those, pass them to setEGLContextFactory and setEGLConfigChooser, respectively.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文