微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环绑定VBO

如何解决循环绑定VBO

由于要使用大量的VBO,我想避免多次重复以下代码

    glBindBuffer(GL_ARRAY_BUFFER,VBOs[0]);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices1),vertices1,GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER,VBOs[1]);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices2),vertices2,VBOs[2]);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices3),vertices3,VBOs[3]);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices4),vertices4,GL_STATIC_DRAW);

我试图用一个循环来简化这段代码。这是我尝试做的事情:

std::string aux = "vertices";
    std::string aux2;
    int aux3;
    std::string aux4; 
    const void* aux5;
    for (int i = 0; i <= 13; i++) {
        aux3 = i++;
        aux4 = std::to_string(aux3);
        aux2 = aux + aux4;
        aux5 = aux2.c_str();
        glBindBuffer(GL_ARRAY_BUFFER,VBOs[i]);
        glBufferData(GL_ARRAY_BUFFER,sizeof(aux2),aux5,GL_STATIC_DRAW);
    }

没有成功。它仍然显示了我使用过的最后一种颜色的图形,但没有绘制其他图形。有没有办法使该循环有效,还是应该继续重复上面的代码?感谢您的帮助。

我还尝试用一个循环来简化代码中的VAOs部分,并且有效。这是我的操作方式:

glGenVertexArrays(14,VAOs); 
    for (int i = 0; i <= 13; i++) { 
        glBindVertexArray(VAOs[i]);
        glBindBuffer(GL_ARRAY_BUFFER,VBOs[i]);
        glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),(void*)0);
        glEnabLevertexAttribArray(0);
    } 

解决方法

您的带有循环的代码不起作用,因为您误解了glBufferData(GL_ARRAY_BUFFER,sizeof(aux2),aux5,GL_STATIC_DRAW)的工作方式。当您呼叫glBufferData(GL_ARRAY_BUFFER,sizeof(vertices1),vertices1,GL_STATIC_DRAW)时,它与vertices1不同。假设[x1_0,x1_1,x1_2,x1_3,y1_0,y1_1,y1_2,y1_3,x2_0,x2_1,...]存储一些内存(实际的顶点如x1,y1,x2,...,其中x1 = [x1_0,x1_3]是您的顶点)。 std::string,因为它是一个浮点变量(内存中有4个字节)。 aux2还存储内存,因此您的vertices1变量不会在代码中替换为['v','e','r','t','i','c','s','1']字符串,但会将std::string作为内存参数传递给函数(每个字符是1个字节)。

#define在运行时有效,而您希望实时替换代码。如果要存档结果,则必须寻找{{1}}。但是,最好有一个顶点数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。