学习日报 2018.8.27

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到纹理采样器最大允许的数字。

  最终渲染代码:

多光源代码截图:

猜你喜欢

转载自www.cnblogs.com/jingrui/p/9545681.html
今日推荐