我试图互相并排实例许多多维数据集。
我的理解是,我需要为每个多维数据集创建一个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/