Проблемы с начинающим проектом рендеринга треугольников openGL - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь создать 8 треугольников, и эти треугольники вращаются вокруг оси z.По какой-то причине ни один из треугольников не появляется, и я не совсем уверен, почему.Мой код компилируется и запускается, поэтому я не знаю, как его отладить.Любая помощь приветствуется

основной код:

#include <glad/glad.h>
#include <GLFW/glfw3.h>




#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

#include "shader_s.h"

#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main()
{
    // glfw: initialize and configure
    // ------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif

    // glfw window creation
    // --------------------
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    // glad: load all OpenGL function pointers
    // ---------------------------------------
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    // build and compile our shader zprogram
    // ------------------------------------
    Shader ourShader("pinwheel.vs", "pinwheel.fs");

    // set up vertex data (and buffer(s)) and configure vertex attributes
    // ------------------------------------------------------------------
    float vertices[] = {
        // positions                // color coords
         0.0f,  0.0f, 0.0f,        0.0f, 1.0f, 0.0f,
         0.0f,  1.0f, 0.0f,        0.0f, 1.0f, 0.0f,
         0.5f,  1.0f, 0.0f,        0.0f, 1.0f, 0.0f,

         0.5f,  1.0f, 0.0f,        0.0f, 1.0f, 0.0f,
         0.25f,  0.5f, 0.0f,       0.0f, 1.0f, 0.0f,
         1.0f,  0.5f, 0.0f,        0.0f, 1.0f, 0.0f,

         0.0f, 0.0f, 0.0f,         0.0f, 0.0f, 1.0f,
        -1.0f,  0.0f, 0.0f,        0.0f, 0.0f, 1.0f,
        -1.0f,  0.5f, 0.0f,        0.0f, 0.0f, 1.0f,

        -1.0f, 0.5f, 0.0f,         0.0f, 0.0f, 1.0f,
        -0.5f,  0.25f, 0.0f,       0.0f, 0.0f, 1.0f,
        -0.5f,  1.0f, 0.0f,        0.0f, 0.0f, 1.0f,


        -1.0f, -0.5f, 0.0f,        1.0f, 0.0f, 0.0f,
        -0.5f, -1.0f, 0.0f,        1.0f, 0.0f, 0.0f,
        -0.25f, -0.5f, 0.0f,       1.0f, 0.0f, 0.0f,

        0.0f, 0.0f, 0.0f,          1.0f, 0.0f, 0.0f,
        0.0f,  -1.0f, 0.0f,        1.0f, 0.0f, 0.0f,
        -0.5f, -1.0f, 0.0f,        1.0f, 0.0f, 0.0f,

        0.0f, 0.0f, 0.0f,          1.0f, 1.0f, 0.0f,
        1.0f, 0.0f, 0.0f,          1.0f, 1.0f, 0.0f,
        1.0f, -0.5f, 0.0f,         1.0f, 1.0f, 0.0f,

        1.0f, -0.5f, 0.0f,         1.0f, 1.0f, 0.0f,
        0.5f, -0.25f, 0.0f,        1.0f, 1.0f, 0.0f,
        0.5f, -1.0f, 0.0f,         1.0f, 1.0f, 0.0f


    };

    unsigned int VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);


    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);



    // position attribute
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    //color attribute
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindVertexArray(0);





    ourShader.use();



    // render loop
    // -----------
    while (!glfwWindowShouldClose(window))
    {
        // input
        // -----
        processInput(window);

        // render
        // ------
        glClearColor(0.8f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);



        // create transformations
        glm::mat4 transform = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix first
        transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

        // get matrix's uniform location and set matrix
        ourShader.use();
        unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
        glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));

        // render container
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES,0, 24);

        // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
        // -------------------------------------------------------------------------------
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // optional: de-allocate all resources once they've outlived their purpose:
    // ------------------------------------------------------------------------
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);


    // glfw: terminate, clearing all previously allocated GLFW resources.
    // ------------------------------------------------------------------
    glfwTerminate();
    return 0;
}

// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    // make sure the viewport matches the new window dimensions; note that width and
    // height will be significantly larger than specified on retina displays.
    glViewport(0, 0, width, height);
}

Вот мои вершинные и фрагментные шейдеры:

VS:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 color;
out vec4 vertexColor;

uniform mat4 transform;


void main()
{
    gl_Position = transform*vec4(aPos, 1.0f);
    vertexColor = vec4(color, 1.0);
}

FS:

#version 330 core
out vec4 FragColor;

in vec4 vertexColor;

void main(){
    FragColor = vertexColor;

}

1 Ответ

0 голосов
/ 02 марта 2019

Этот вызов:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));

… переопределяет предыдущий вызов и привязывает атрибут 0 (атрибут позиции) к вашим данным цвета.Сделайте первый аргумент 1 для правильной привязки.

...