配置VAO和VBO时,顶点数据数组应该在同一个方法中吗? (OpenGL)
When configuring VAOs and VBOs, should the vertex data array be in the same method? (OpenGL)
我正在使用 VBO 和 VAO 通过 OpenGL 实现人体骨骼动画。不过,我发现了一些有趣的事情。首先这是我的基础'bone'class
class Bone {
private:
//Joint information compared to the parent Joint!
int BoneID;
glm::mat4 R;
glm::mat4 T;
//orientation of the bone
glm::mat4 Orientation;
Bone * childBone[MAX];
int nChildren = 0;
void recalculateOrientation() {
Orientation = Orientation * R;
}
public:
unsigned int VAO, VBO;
Bone(int BoneID, glm::mat4 R = glm::mat4(), glm::mat4 T = glm::mat4(), glm::mat4 Orientation = glm::mat4()) {
//setup the matrices and orientation
this->BoneID = BoneID;
this->R = R;
this->T = T;
this->Orientation = Orientation;
}
void setVAO(float * vertexData) {
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
}
void setChild(Bone * child) {
childBone[nChildren] = child;
nChildren++;
}
......
};
关注的方法是Bone::setVAO(float * vertexData)
。然后我用下面的方法将顶点位置数据设置到Bone数组中。
void setVertexData(Bone * Bones) {
//Bones
float pelvisVertices[] = {
// Back face
-0.5f, -0.2f, -0.2f, // Bottom-left
0.5f, 0.2f, -0.2f, // top-right
0.5f, -0.2f, -0.2f, // bottom-right
0.5f, 0.2f, -0.2f, // top-right
-0.5f, -0.2f, -0.2f, // bottom-left
-0.5f, 0.2f, -0.2f, // top-left
......
}
Bones[0].setVAO(pelvisVertices);
}
在我从 main()
调用 setVertexData()
之后,我在渲染循环中尝试了以下代码。
//For debugging
glm::mat4 model;
glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
glm::mat4 view = camera.GetViewMatrix();
shader.setMat4("model", model);
shader.setMat4("projection", projection);
shader.setMat4("view", view);
glBindVertexArray(Bones[0].returnVAO());
glDrawArrays(GL_TRIANGLES, 0, 36);
但是,window 上没有绘制任何内容。所以我稍微更改了代码,这次,我决定像这样在 setVertexData(Bone * bones)
中配置 VAO 和 VBO。
void setVertexData(Bone * Bones) {
//Bones
float pelvisVertices[] = {
// Back face
-0.5f, -0.2f, -0.2f, // Bottom-left
0.5f, 0.2f, -0.2f, // top-right
0.5f, -0.2f, -0.2f, // bottom-right
0.5f, 0.2f, -0.2f, // top-right
-0.5f, -0.2f, -0.2f, // bottom-left
-0.5f, 0.2f, -0.2f, // top-left
......
};
// Bones[0].setVAO(pelvisVertices);
glGenVertexArrays(1, &Bones[0].VAO);
glGenBuffers(1, &Bones[0].VBO);
glBindVertexArray(Bones[0].VAO);
glBindBuffer(GL_ARRAY_BUFFER, Bones[0].VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(pelvisVertices), pelvisVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
}
如您所见,我只是简单地将顶点数据数组和VAO、VBO配置放在同一个方法上。不过,这次是画在了屏幕上!我从未听说过顶点数据数组应该与 VAO、VBO 配置采用相同的方法。发生这种情况的原因是什么?
那是因为指针的大小不会 return 元素的数量,而是指针的大小(4 或 8 个字节)。因此,您告诉 OpenGL 您的顶点数组有 4 或 8 个字节
我正在使用 VBO 和 VAO 通过 OpenGL 实现人体骨骼动画。不过,我发现了一些有趣的事情。首先这是我的基础'bone'class
class Bone {
private:
//Joint information compared to the parent Joint!
int BoneID;
glm::mat4 R;
glm::mat4 T;
//orientation of the bone
glm::mat4 Orientation;
Bone * childBone[MAX];
int nChildren = 0;
void recalculateOrientation() {
Orientation = Orientation * R;
}
public:
unsigned int VAO, VBO;
Bone(int BoneID, glm::mat4 R = glm::mat4(), glm::mat4 T = glm::mat4(), glm::mat4 Orientation = glm::mat4()) {
//setup the matrices and orientation
this->BoneID = BoneID;
this->R = R;
this->T = T;
this->Orientation = Orientation;
}
void setVAO(float * vertexData) {
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
}
void setChild(Bone * child) {
childBone[nChildren] = child;
nChildren++;
}
......
};
关注的方法是Bone::setVAO(float * vertexData)
。然后我用下面的方法将顶点位置数据设置到Bone数组中。
void setVertexData(Bone * Bones) {
//Bones
float pelvisVertices[] = {
// Back face
-0.5f, -0.2f, -0.2f, // Bottom-left
0.5f, 0.2f, -0.2f, // top-right
0.5f, -0.2f, -0.2f, // bottom-right
0.5f, 0.2f, -0.2f, // top-right
-0.5f, -0.2f, -0.2f, // bottom-left
-0.5f, 0.2f, -0.2f, // top-left
......
}
Bones[0].setVAO(pelvisVertices);
}
在我从 main()
调用 setVertexData()
之后,我在渲染循环中尝试了以下代码。
//For debugging
glm::mat4 model;
glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
glm::mat4 view = camera.GetViewMatrix();
shader.setMat4("model", model);
shader.setMat4("projection", projection);
shader.setMat4("view", view);
glBindVertexArray(Bones[0].returnVAO());
glDrawArrays(GL_TRIANGLES, 0, 36);
但是,window 上没有绘制任何内容。所以我稍微更改了代码,这次,我决定像这样在 setVertexData(Bone * bones)
中配置 VAO 和 VBO。
void setVertexData(Bone * Bones) {
//Bones
float pelvisVertices[] = {
// Back face
-0.5f, -0.2f, -0.2f, // Bottom-left
0.5f, 0.2f, -0.2f, // top-right
0.5f, -0.2f, -0.2f, // bottom-right
0.5f, 0.2f, -0.2f, // top-right
-0.5f, -0.2f, -0.2f, // bottom-left
-0.5f, 0.2f, -0.2f, // top-left
......
};
// Bones[0].setVAO(pelvisVertices);
glGenVertexArrays(1, &Bones[0].VAO);
glGenBuffers(1, &Bones[0].VBO);
glBindVertexArray(Bones[0].VAO);
glBindBuffer(GL_ARRAY_BUFFER, Bones[0].VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(pelvisVertices), pelvisVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
}
如您所见,我只是简单地将顶点数据数组和VAO、VBO配置放在同一个方法上。不过,这次是画在了屏幕上!我从未听说过顶点数据数组应该与 VAO、VBO 配置采用相同的方法。发生这种情况的原因是什么?
那是因为指针的大小不会 return 元素的数量,而是指针的大小(4 或 8 个字节)。因此,您告诉 OpenGL 您的顶点数组有 4 或 8 个字节