1.《新东方考研英语》 俞敏洪/乱序版 2015年2月第1版
1个list的单词
2.《c++语言程序设计》郑莉 董渊 何江舟 编著 清华大学出版社 2010年7月第4版
回顾C++前3章语法、结构、函数等内容。编写完多光源部分代码。
3.网站https://learnopengl-cn.github.io/intro/
学习第六节网格的基础知识
心得:
OpenGL
1.网格基本介绍
一个网格应该至少需要一系列的顶点,每个顶点包含一个位置向量、一个法向量和一个纹理坐标向量。一个网
格还应该包含用于索引绘制的索引以及纹理形式的材质数据(漫反射/镜面光贴图)。
网格类的结构:
class Mesh
{
public:
/* 网格数据 */
vector<Vertex> vertices;
vector<unsigned int> indices;
vector<Texture> textures;
/* 函数 */
Mesh(vector<Vertex> vertices, vector<unsigned int> indices, vector<Texture> textures);
void Draw(Shader shader);
private:
/* 渲染数据 */
unsigned int VAO, VBO, EBO;
/* 函数 */
void setupMesh();
};
2.结构体
C++结构体的内存布局是连续的。如果将结构体作为一个数据数组使用,那么它将会以顺序排列结构体的变量,
这将会直接转换为我们在数组缓冲中所需要的float(实际上是字节)数组。由于这个特性,能够直接传入一大
列的Vertex结构体的指针作为缓冲的数据,它们将会完美地转换为glBufferData所能用的参数:
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW);
结构体的另外一个很好的用途是它的预处理指令offset(s,m),它的第一个参数是一个结构体,第二个参数是
这个结构体中变量的名字。这个宏会返回那个变量距结构体头部的字节偏移量。这正好可以用在定义
glVertexAttribPointer函数中的偏移参数。
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal));
3.Draw函数
调用glDrawElements函数之前先绑定相应的纹理,通过一个命名规则来解决纹理过多和难以处理的问题。
每个漫反射纹理被命名为texture_diffuseN
,每个镜面光纹理应该被命名为texture_specularN
,其中N
的
范围是1到纹理采样器最大允许的数字。
最终渲染代码:
多光源代码截图: