【问题标题】:Binding VBOs in a cycle [duplicate]在一个循环中绑定 VBO [重复]
【发布时间】:2021-01-05 01:41:52
【问题描述】:

我想避免多次重复以下代码,因为我使用了大量的 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, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices3), vertices3, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, 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);
    } 

【问题讨论】:

    标签: c++ opengl glut glew


    【解决方案1】:

    您的循环代码不起作用,因为您误解了 std::string 的工作原理。当您调用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_1, x1_2, x1_3] 因为它是一个浮点变量(内存中的 4 个字节)。 std::string 也存储内存,因此您的 aux2 变量不会在您的代码中替换为 vertices1 字符串,但会将 ['v', 'e', 'r', 't', 'i', 'c', 'e', 's', '1'] 作为内存参数传递给函数(每个字符为 1 个字节)。

    std::string 在运行时工作,而您希望实时替换您的代码。如果要存档结果,则必须查找 #define。但是,最好有一个顶点数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多