网格
用建模工具构建物体时,通常不会直接使用单个形状来构建一个完整的模型。一般来说,一个模型会由几个子模型组合拼接而成,模型中的这些子模型/形状就是一个网格。
一个网格(包含顶点、索引和材质属性)是在OpenGL中绘制的最小单位。一个模型通常包含多个网格。
想要绘制一个模型,我们不会去渲染整个模型,而是去渲染这个模型所包含的所有独立的Mesh。
定义网格
一个网格至少需要:
- 一组顶点
- 纹理形式表现的材质数据
- 索引绘制用的索引
定义顶点
一个顶点包含三个要素:
- 位置向量
- 法线向量
- 纹理坐标
结构体定义如下:
struct Vertex
{
glm::vec3 Position;
glm::vec3 Normal;
glm::vec2 TexCoords;
};
定义纹理
纹理需要定义两个属性:
- 纹理Id
- 纹理类型:diffuse纹理或者specular纹理
结构体定义如下:
struct Texture
{
GLuint id;
String type;
};
定义网格
在定义好顶点和纹理的表达后,我们可以定义网格的结构了:
class Mesh
{
Public:
vector<Vertex> vertices;
vector<GLuint> indices;
vector<Texture> textures;
Mesh(vector<Vertex> vertices, vector<GLuint> indices, vector<Texture> texture);
Void Draw(Shader shader);
private:
GLuint VAO, VBO, EBO;
void setupMesh();
}
在这个类中定义了三个函数:
- 构造函数:初始化所有必须的数据
- setupMesh:初始化缓冲
- Draw : 绘制网格
网友评论