首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VAO不渲染

VAO不渲染
EN

Stack Overflow用户
提问于 2017-07-12 14:46:44
回答 1查看 44关注 0票数 0

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-12 15:03:35

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

代码语言:javascript
复制
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;
}

然后在你的主要功能中:

代码语言:javascript
复制
GLuint vertexbuffer = loader.loadToVAO(vertices, sizeof(vertices) / sizeof(vertices[0]));

我鼓励你多读一些关于这里主题的文章。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45060955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档