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