C++/OpenGL VAO问题

4
#define GLEW_STATIC
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <GL\glew.h>
#include <glm.hpp>
#include <iostream>
#include <fstream>
#include <string>

#define WIDTH 800
#define HEIGHT 600
#define TITLE "Dynamic"

GLFWwindow* window;
int vaoID;

float vertices[] = {-0.5f, 0.5f, 0, -0.5f, -0.5f, 0,    0.5f, 0.5f, 0,  0.5f, 0.5f, 0,  -0.5f, -0.5f,   0,  0.5f, -0.5f, 0};

void loadToVAO(float vertices[]);

void update() {
    loadToVAO(vertices);
    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();
        glClear(GL_COLOR_BUFFER_BIT);
        glClearColor(1, 0, 0, 1);
        glDrawArrays(GL_TRIANGLES, 0, 6);
        glfwSwapBuffers(window);
    }
}

int main() {
    if (!glfwInit())
        std::cout << "Couldn't initialize GLFW!" << std::endl;

    window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL);
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    if (GLEW_OK != glewInit())
        std::cout << "GLEW fucked up!" << std::endl;

    std::cout << "Your GL version: " << glGetString(GL_VERSION) << std::endl;
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    update();
}



void loadShaders() {

}

void loadToVAO(float vertices[]) {
    GLuint vboID;
    GLuint vaoID;
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) * 8, vertices, GL_STATIC_DRAW);
    glGenVertexArrays(1, &vaoID);
    glBindVertexArray(vaoID);
    std::cout << vaoID << std::endl;
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    glEnableVertexAttribArray(0);
}

这是我用于创建和渲染包含顶点位置的VBO的VAO代码。但不幸的是,它并没有起作用。它绘制的是一个三角形而不是四边形。但当我将loadToVAO函数的代码放在while循环之前的update函数中时,它就可以正常工作了。

1个回答

4
sizeof 操作符总是返回底层类型的大小。当您将 loadToVAO 的内容复制到更新函数中时,sizeof(vertices) 基本上是 sizeof(float[18]),它是数组的总大小。
但在 loadToVAO 中,sizeof(vertices) 将函数参数 vertices 作为输入,而不是全局变量。由于 C++ 中未定义大小的数组参数被视为相同类型的指针,因此我们在这里有:
sizeof(vertices) == sizeof(float[]) == sizeof(float*)

指针的大小(4或8)不再是数据大小。

为了解决这个问题,可以将数组的大小传递给函数,这是C的方法。更现代的方法是首先使用std::arraystd::vector存储数据。

编辑:第二次查看时,我看到您在第一次使用sizeof(vertices) * 8。我不确定8来自哪里,因为您既没有8个元素,也没有float的大小为8字节。


非常感谢,现在它可以工作了。8与字节大小有关。 - Max
很高兴能够帮助到您。如果这个解决方案解决了您的问题,请不要忘记接受答案 :) - BDL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接