我试图互相并排实例许多多维数据集。

我的理解是,我需要为每个多维数据集创建一个MVP矩阵并将其绑定(bind),然后以某种方式更改位置。然后在for循环中运行您想要的多维数据集。

这是我尝试过的:

while (!glfwWindowShouldClose(window)) {
    glClearColor(0.0f / 255.0f, 170.0f / 255.0f, 204.0f / 255.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(programID);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
        0,
        3, GL_FLOAT, GL_FALSE,
        0,
        (void*)0
    );

    computeMatricesFromInputs();
    glm::mat4 ProjectionMatrix = getProjectionMatrix();
    glm::mat4 ViewMatrix = getViewMatrix();
    glm::mat4 ModelMatrix = glm::mat4(1.0);
    glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;

    for (int i = 0; i == cubes; i++) {
        GLuint MatrixID = glGetUniformLocation(programID, "MVP");
        glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
        glDrawArraysInstanced(GL_TRIANGLES, 0, 1, i);
    }

    //GLuint MatrixID = glGetUniformLocation(programID, "MVP");
    //glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
    //glDrawArrays(GL_TRIANGLES, 0, 12*3);
    glDisableVertexAttribArray(0);

    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, texturebuffer);
    glVertexAttribPointer(
        1,
        2,
        GL_FLOAT,
        GL_FALSE,
        0,
        (void*)0
    );
    glfwSwapBuffers(window);
    glfwPollEvents();
}

这根本不会绘制任何多维数据集,而且我无法弄清楚如何将每个多维数据集的位置更改为彼此并排。那么,为什么此代码不绘制实例化的多维数据集,又如何能够将每个多维数据集的位置更改为彼此相邻呢?

最佳答案

glDrawArraysInstanced 的第三个参数是要分别绘制立方体的顶点数(就像 glDrawArrays 一样),第四个参数是要通过1个绘制调用绘制的实例数,而不是实例的索引。

无论如何,您根本不需要 glDrawArraysInstanced ,因为您分别绘制了每个立方体。使用 glDrawArrays 代替:

for (int i = 0; i < cubes; i++) {
    GLuint MatrixID = glGetUniformLocation(programID, "MVP");
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
    glDrawArrays(GL_TRIANGLES, 0, noOfVertices);
}

可以用glDrawArraysInstanced代替:

glDrawArraysInstanced(GL_TRIANGLES, 0, noOfVertices, cubes);

这将立即绘制所有多维数据集cubes。为此,您必须找到一种为每个实例使用不同模型矩阵的方法。
一种可能是使用Shader Storage Buffer Object (SSBO)将所有模型矩阵存储在数组中。在顶点着色器中,实例的索引(多维数据集的索引)可以通过内置输入 gl_InstanceID 获得。该变量可用于从数组中获取实例的正确模型矩阵。

例如:

layout(std430) buffer Matrices
{
    mat4 mvpArray[];
};

void main()
{
    mat4 mvp = mvpArray[gl_InstanceID];

    // [...]
}

关于c++ - 实例化彼此相邻的OpenGL多维数据集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61036711/

10-11 15:42