OpenGL ES 2.0 не работает рендеринг

С просмотрел руководство по созданию треугольника в OpenGL ES 2.0 и написал методы для отрисовки, как в нём, но код не заработал. Отображается только цвет заднего фона. Помогите, пожалуйста. При открытие приложения вызывается инициализация окна и отрисовка. Шейдеры успешно компилируются.

#include <stdlib.h>
#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <android_native_app_glue.h>

typedef struct{ //структура с данными для рендеринга
    EGLDisplay display;
    EGLSurface surface;
    EGLContext context;
    struct android_app* app;
    int32_t width;
    int32_t height;
    uint32_t programm_object;
    uint32_t v_shader;
    uint32_t f_shader;
} render_conf;

unsigned int load_shader(char *shader_source, int type){ //загрузка шейдера
    unsigned int shader;
    shader = glCreateShader(type);
    if(!shader)
        return 0;
    glShaderSource(shader, 1, (const GLchar *const*) &shader_source, NULL);
    glCompileShader(shader);
    int compiled;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    if(!compiled){
        glDeleteShader(shader);
        return 0;
    }
    return shader;
}

void renderer_init_shaders(render_conf *rc){ //инициализация шейдеров
    char *vShaderStr =
            "attribute vec4 vPosition; \n"
            "void main()               \n"
            "{                         \n"
            "  gl_Position = vPosition;\n"
            "}                         \n";

    char *fShaderStr =
            "precision mediump float;                     \n"
            "void main()                                  \n"
            "{                                            \n"
            "  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);   \n"
            "}                                            \n";
    unsigned int vertex_shader, fragment_shader;
    unsigned int program_object;
    int linked;

    vertex_shader = load_shader(vShaderStr, GL_VERTEX_SHADER);
    fragment_shader = load_shader(fShaderStr, GL_FRAGMENT_SHADER);

    program_object = glCreateProgram();

    if (!program_object)
        return;

    glAttachShader(program_object, vertex_shader);
    glAttachShader(program_object, fragment_shader);
    glBindAttribLocation(program_object, 0, "vPosition");
    glLinkProgram(program_object);
    glGetProgramiv(program_object, GL_LINK_STATUS, &linked);

    if (!linked){
        glDeleteProgram(program_object);
        return;
    }

    rc->programm_object = program_object;
    rc->v_shader = vertex_shader;
    rc->f_shader = fragment_shader;

    glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
}

int renderer_init_display(render_conf *rc) { //инициализация окна
    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(rc->app->window, 0, 0, format);
    surface = eglCreateWindowSurface(display, config, rc->app->window, NULL);
    context = eglCreateContext(display, config, NULL, NULL);
    if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE)
        return -1;
    eglQuerySurface(display, surface, EGL_WIDTH, &w);
    eglQuerySurface(display, surface, EGL_HEIGHT, &h);

    rc->display = display;
    rc->context = context;
    rc->surface = surface;
    rc->width = w;
    rc->height = h;
    return 0;
}

void renderer_draw(render_conf *rc){ //отрисовка
    const float verts[] = {
    0.0f, 0.5f, 0.0f,
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f
    };
    glViewport(0, 0, rc->width, rc->height);

    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(rc->programm_object);

    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, verts);
    glEnableVertexAttribArray(0);

    glDrawArrays(GL_TRIANGLES, 0, 3);
    eglSwapBuffers(rc->display, rc->surface);
}

void renderer_enable(render_conf *rc){ //инициализация рендерера
    renderer_init_display(rc);
    renderer_init_shaders(rc);
}

Ответы (0 шт):