網格
用建模工具構建物體時,通常不會直接使用單個形狀來構建一個完整的模型朗儒。一般來說颊乘,一個模型會由幾個子模型組合拼接而成,模型中的這些子模型/形狀就是一個網格醉锄。
一個網格(包含頂點乏悄、索引和材質屬性)是在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 : 繪制網格