#android #opengl-es #opengl-es-2.0 #egl
#Android #opengl-es #opengl-es-2.0 #egl
Вопрос:
Для проекта OpenGL Android, над которым я работаю, мне нужна ES 2.0, но мне нужен контроль буферов рендеринга / поверхностей, который я привык получать с помощью EGL. Поскольку я не могу придумать какой-либо способ рендеринга в закадровый буфер с использованием GLSurfaceView, а затем никогда не отображать буфер. Даже если я использую GLSurfaceView.EGLContextFactory, я не могу придумать никакого способа выполнить это без функций / констант EGL 1.2, не включенных в пакет EGL Android (например, EGL_CONTEXT_CLIENT_VERSION).
Итак, первый очевидный вопрос: есть ли способ 1) использовать EGL с ES 2.0, несмотря на отсутствие EGL_CONTEXT_CLIENT_VERSION и eglBindAPI()? 2) существует ли какой-либо новый API для настройки контекста рендеринга, используемого перед вызовом обратного вызова GLSurfaceView surfaceCreated (EGLConfig)?
Ответ №1:
Если вы можете использовать EGLContextFactory и EGLConfigChooser по умолчанию, вы можете использовать метод setEGLContextClientVersion() GLSurfaceView.
В противном случае, если вы пишете свои собственные EGLContextFactory и EGLConfigChooser, просто определите константы самостоятельно. В окне выбора конфигурации определите
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;
}
Когда вы их напишете, передайте их в setEGLContextFactory и setEGLConfigChooser соответственно.