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

Issues with beginner openGL project rendering triangles

我正在尝试创建 8 个三角形,并让这些三角形绕 z 轴旋转。出于某种原因 none 的三角形出现了,我不太确定为什么。我的代码编译并运行,所以我真的不知道如何调试它。任何帮助将不胜感激

主要代码:

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

这是我的顶点和片段着色器:

对比:

#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;

}

这次通话:

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

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