glGenFramebuffers не работает с Native Android Project в VS 2019 - PullRequest
0 голосов
/ 31 октября 2019

Я пытался выполнить рендеринг в текстуру, но 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 enter image description here

Добавьтекод сверху вниз engine_init_display внутри main.cpp в самом низу функции. Также обязательно добавьте #include <GLES2/gl2.h> в начало файла. enter image description here

Для уточнения

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;
}
...