Здравствуйте, уже с почти 2 недели мучаюсь с тем чтобы написать простую обертку над OpenGL (дипломную пишу на тему разработки игровых движков). Может кто подсказать в чем у меня ошибка (знаю что нагло с моей стороны вот так просить посмотреть чужой код, однако я уже долго мучаюсь и ничего в голову не лезет)
Это код метода main
GLfloat vertex_positions[] = {
0.0f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f
};
GLchar *vertexShader = (GLchar *)
"#version 150\n"
"\n"
"in vec2 position;\n"
"\n"
"void main()\n"
"{\n"
" gl_Position = vec4(position, 0.0, 1.0);\n"
"}";
GLchar *fragmentShader = (GLchar *)
"#version 400 core\n"
"\n"
"out vec4 fColor;\n"
"\n"
"void main()\n"
"{\n"
" fColor = vec4(0.5, 0.4, 0.8, 1.0);\n"
"}";
static const GLfloat vertex_colors[] =
{
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f
};
Shader shader;
shader.CompileShader(Shader::ShaderType::Fragment, fragmentShader);
shader.CompileShader(Shader::ShaderType::Vertex, vertexShader);
glBindFragDataLocation(*shader.GetProgram(), 0, "fColor");
shader.Link();
Texture texture((GLfloat *) vertex_colors, 16);
Model model (vertex_positions, &shader, &texture);
while (!glfwWindowShouldClose(window))
{
static const float black[] = { 0.2f, 0.3f, 1.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, black);
shader.Bind();
model.Draw();
glfwPollEvents();
glfwSwapBuffers(window);
}
Вот код класса Model
void Model::Draw() {
glBindVertexArray(_vao);
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
Model::Model(GLfloat meshVert[], int m_size, GLuint vertexInd[], int v_size, Shader *material, Texture *texture) {
glGenVertexArrays(1, &_vao);
glBindVertexArray(_vao);
glGenBuffers(1, &_vbo);
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*m_size, meshVert, GL_STATIC_DRAW);
GLint posAttrib = glGetAttribLocation(*material->GetProgram(), "position");
glEnableVertexAttribArray((GLuint) posAttrib);
glVertexAttribPointer((GLuint) posAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0);
GLint colAttrib = glGetAttribLocation(*material->GetProgram(), "color");
glEnableVertexAttribArray((GLuint) colAttrib);
glVertexAttribPointer((GLuint) colAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
}
Профайлер выдает ошибку на то, что я неправильно использую glDrawArrays, однако я проверил забайденные данные и там было пусто. Все остальное вроде как на месте (шейдеры и программа прилинкованы и отображаются в профайлере)
P.S.: Система MacOS X Sierra, Intel HD 6000. Думаю этих данных достаточно.