我是现代 OpenGL VBO/VAO 的新手,我为一件事而苦恼:我已经根据本教程编写了一个 RectangleAsset ,但我不确定如何将有关纹理 UV 的信息移动到 RactangleAssetInstance(我的矩形可以有不同的纹理)。
我是否必须为其创建新的 VAO,或者我可以通过其他方式传递 UV?或者为 UV 添加第二个 VBO?最重要的是:解决这个问题的最佳实践是什么?
struct RectangleAsset {
GLuint VBO;
GLuint VAO;
};
struct RectangleAssetInstance { //this is actually more complex class in my code
RectangleAsset rect; //but tried to extract the most imporatant code
glm::mat4 transform;
Texture * texture;
void UpdateTransform(int,int,int,int);
private:
int x,y,width,height;
};
和加载 RectangleAsset 的函数:
void GUIRenderer::init()
{
image = new Program ("vs.glsl", "fs.glsl");
glGenVertexArrays(1, &rect.VAO);
glBindVertexArray(rect.VAO);
glGenBuffers(1, &rect.VBO);
glBindBuffer(GL_ARRAY_BUFFER, rect.VAO);
GLfloat vertexData[] = {
// X Y Z U V
0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
};
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(image->attrib("vert"));
glVertexAttribPointer(image->attrib("vert"), 3, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), NULL);
glEnableVertexAttribArray(image->attrib("vertTexCoord"));
glVertexAttribPointer(image->attrib("vertTexCoord"), 2, GL_FLOAT, GL_TRUE, 5*sizeof(GLfloat), (const GLvoid*)(3 * sizeof(GLfloat)));
glBindVertexArray(0);
}
注意:我计划只在一个地方使用 RectangleAssetInstances,在一个 std::vector 中进行 GUI 渲染(非静态 gui)。将所有矩形合并到一个 VBO 和 VAO 中可能是个好主意(并在添加/删除 UIElement 时重新创建它)?
欢迎任何学习 OpenGL 最佳实践的建议。