使用 glVertexAttribFormat 时不获取 OpenGL 输出

Don't get OpenGL output when using glVertexAttribFormat

我正在尝试使用 glVertexAttribFormat 和 glVertexAttribBinding 创建两个三角形,但它不起作用。我在此处的问题中遵循了如何执行此操作的描述 ()。我真的不知道该尝试什么。我是 OpenGL 的新手,所有对 glVertexAttribFormat 的描述似乎都假定您已经了解 OpenGL。

这是我的代码:

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

#include <iostream>

void adjustViewportToWindowSize(GLFWwindow* window, int width, int height);
void checkEsc(GLFWwindow* window);

int main(void)
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "Tab name", NULL, NULL);
    if (window == NULL) 
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
         std::cout << "Failed to initialize GLAD" << std::endl;
         return -1; 
    }

    glViewport(0, 0, 800, 600); //size of GL rendering window. 
    glfwSetFramebufferSizeCallback(window, adjustViewportToWindowSize);     

    const char* vertexShaderSource = "#version 430 core\n"
        "layout (location = 0) in vec3 aPos;\n"
        "void main()\n"
        "{\n"
        "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
        "}[=10=]";

const char* fragmentShaderSource = "#version 430 core\n"
    "out vec4 FragColor;\n"
    "void main()\n"
    "{\n"
    "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
    "}[=10=]";

unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);

unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);

unsigned int shaderProgram;
shaderProgram = glCreateProgram();

//Attaching shaders to program
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);


//Can delete shader objects after they are linked
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

float triangleVertices1[] = {
    -0.50f, 0.0f, 0.0f,
    -0.25f, 0.5f, 0.0f,
     0.00f, 0.0f, 0.0f  
};

float triangleVertices2[] = {
    0.0f, 0.0f, 0.0f,
    0.25f, 0.5f, 0.0f,
    0.5f, 0.0f, 0.0f
};

unsigned int aVBO[2], VAO2;
glGenVertexArrays(1, &VAO2);


glBindVertexArray(VAO2);
glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);      //format setup without a buffer
glVertexAttribBinding(0, 0);
glBindVertexArray(0);

//Bind Buffers to data next
glGenBuffers(2, aVBO);
glBindBuffer(GL_ARRAY_BUFFER, aVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices1), triangleVertices1, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, aVBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices2), triangleVertices2, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);


while (!glfwWindowShouldClose(window))
{
    checkEsc(window);   

    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);               

    glUseProgram(shaderProgram);

    glBindVertexArray(VAO2);

    glBindVertexBuffer(0, aVBO[0], 0, 3*sizeof(float));
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexBuffer(0, aVBO[1], 0, 3*sizeof(float));
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(0);

    glfwSwapBuffers(window);
    glfwPollEvents();
}

//Clear up
glDeleteVertexArrays(1, &VAO2);
glDeleteBuffers(1, aVBO);
glDeleteProgram(shaderProgram);

glfwTerminate();
return 0; 

}

void adjustViewportToWindowSize(GLFWwindow* window, int width, int height) 
{
    glViewport(0, 0, width, height);
}

void checkEsc(GLFWwindow *window) 
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

也可以在 github 上访问:https://github.com/Ritzerk/OpenGLSelfStudy

除了设置缓冲区绑定之外,您还必须在着色器中启用顶点属性。为此,您必须在 VAO 设置期间调用 glEnableVertexAttribArray

glBindVertexArray(VAO2);
glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(0, 0);

//Enable input in shader
glEnableVertexAttribArray(0);

glBindVertexArray(0);