彼此相邻的实例立方体

问题描述 投票:1回答:1

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

我的理解是,我需要为每个多维数据集创建一个MVP矩阵并将其绑定,然后以某种方式更改位置。然后在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();
}

这根本不画任何立方体,我不知道如何改变每个立方体彼此并排的位置。那么,为什么这段代码不绘制实例化的多维数据集,又如何能够将每个多维数据集的位置更改为彼此相邻呢?

c++ opengl instance glfw glm-math
1个回答
0
投票

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

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

glDrawArraysInstanced

可以用glDrawArraysInstanced代替:

glDrawArrays

将立即绘制所有多维数据集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获得。该变量可用于从数组中获取实例的适当模型矩阵。

© www.soinside.com 2019 - 2024. All rights reserved.