Я пытался выполнить рендеринг в текстуру, но glGenFramebuffers
не дает мне действительный объект буфера кадра.
Я пытался вызвать glGenFramebuffers
в разных местах на случай, если OpenGL ES API не былполностью инициализирован. Затем я попытался создать новый проект Native Android с помощью Visual Studio 2019 и вызвать glGenFramebuffers с тем же результатом.
В самом низу engine_init_display
внутри шаблона Native Android, который я вызываю приведенным ниже кодом.
uint nFrameBufferID = 0;
glGenFramebuffers(1, &nFrameBufferID);
Результат всегда равен 0. Я не могу получить действительный идентификатор буфера кадра. Что я делаю не так?
ОБНОВЛЕНИЕ - ШАГИ ДЛЯ ВОСПРОИЗВЕДЕНИЯ:
Создание проекта Native-Android Application
с Visual Studio
Добавьтекод сверху вниз engine_init_display
внутри main.cpp
в самом низу функции. Также обязательно добавьте #include <GLES2/gl2.h>
в начало файла.
Для уточнения
static int engine_init_display(struct engine* engine) {
// initialize OpenGL ES and EGL
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
EGLint w, h, format;
EGLint numConfigs;
EGLConfig config;
EGLSurface surface;
EGLContext context;
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, 0, 0);
eglChooseConfig(display, attribs, &config, 1, &numConfigs);
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
context = eglCreateContext(display, config, NULL, NULL);
if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
LOGW("Unable to eglMakeCurrent");
return -1;
}
eglQuerySurface(display, surface, EGL_WIDTH, &w);
eglQuerySurface(display, surface, EGL_HEIGHT, &h);
engine->display = display;
engine->context = context;
engine->surface = surface;
engine->width = w;
engine->height = h;
engine->state.angle = 0;
// Initialize GL state.
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
glDisable(GL_DEPTH_TEST);
uint nFrameBufferID = 0;
glGenFramebuffers(1, &nFrameBufferID);
return 0;
}