我试图相互并排地实例许多多维数据集。
我的理解是,我需要为每个多维数据集创建一个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();
}
这根本不画任何立方体,我不知道如何改变每个立方体彼此并排的位置。那么,为什么这段代码不绘制实例化的多维数据集,又如何能够将每个多维数据集的位置更改为彼此相邻呢?
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
获得。该变量可用于从数组中获取实例的适当模型矩阵。