【问题标题】:VAO not renderingVAO 不渲染
【发布时间】:2017-07-12 14:46:44
【问题描述】:

我创建了一个加载器类来加载 V.A.Os 纹理等,但是当我使用这个方法时

GLuint Loader::loadToVAO(GLfloat* vertices)
{
    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);

    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    return vertexbuffer;
}

这里没有渲染任何东西是我的渲染代码:

window.createWindow();

GLfloat vertices[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

GLuint vertexbuffer = loader.loadToVAO(vertices);

glClearColor(0, 1, 1, 0);

// It works fine when i generate the vao in the main method but not in the loader class
GLuint vertexbuffer1;
glGenBuffers(1, &vertexbuffer1);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer1);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

std::cout << vertexbuffer1 << std::endl;
std::cout << vertexbuffer << std::endl;

while (!window.shouldClose())
{
    window.clearWindow();

    // render here
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer1);
    glVertexAttribPointer(
        0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
    );
    // Draw the triangle !
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle
    glDisableVertexAttribArray(0);

    window.updateWindow();
}

return 0;

当我尝试渲染 vertexbuffer1(在 main 方法中加载的那个)时它渲染得很好,但是顶点缓冲区没有渲染任何东西。 任何帮助将不胜感激

编辑: 这是我试图遵循的教程 - http://www.opengl-tutorial.org/

【问题讨论】:

    标签: c++ opengl glfw glew


    【解决方案1】:

    您在函数内的指针类型上使用sizeof,这几乎肯定不是您想要的。数组在 C 和 C++ 等语言中不是 first-class citizens,它们衰减为指针,指针不携带有关它们存储的数据量的信息。您想要做的是将数组的大小作为附加参数传递:

    GLuint Loader::loadToVAO(GLfloat* vertices, size_t num_vertices)
    {
        GLuint VertexArrayID;
        glGenVertexArrays(1, &VertexArrayID);
        glBindVertexArray(VertexArrayID);
    
        GLuint vertexbuffer;
        glGenBuffers(1, &vertexbuffer);
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(*vertices) * num_vertices, vertices, 
        GL_STATIC_DRAW);
        return vertexbuffer;
    }
    

    然后在你的主函数中:

    GLuint vertexbuffer = loader.loadToVAO(vertices, sizeof(vertices) / sizeof(vertices[0]));
    

    我鼓励您阅读更多有关该主题的信息here。

    【讨论】:

    • 非常感谢!我已经挣扎了好几天了,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多