初学者openGL项目渲染三角形的问题

时间:2019-03-02 02:17:24

标签: c++ opengl graphics game-engine graphics2d

我正在尝试创建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 :(得分:1)

此电话:

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

…覆盖上一个调用,并将属性0(位置属性)绑定到您的颜色数据。使第一个参数1具有正确的绑定。