@Airat1995
Студент

Где я ошибся с привязкой?

Здравствуйте, уже с почти 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. Думаю этих данных достаточно.
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы