OPENGL学习脚印

声明:本文转载自wangdingqiao的博客专栏–OPENGL学习脚印,仅仅对OPENGL学习脚印专栏的文章进行了整理,方便初学者按照顺序学习。同时也在这里感谢原创博主提供的学习笔记。

1、环境搭建

我们需要下载和编译两个第三方库:
GLEW 负责绘图函数的获取
GLFW 负责创建绘图上下文和窗口系统管理
下载并编译后,获取到两个库的lib和dll文件,我们就可以开始编写第一个程序了。

2、绘制一个三角形

接着上一节内容,开发环境搭建好后,我们当然想立即编写3D应用程序了。不过我们还需要些耐心,因为OpenGL是一套底层的API,因而我们要掌握的基本知识稍微多一点,在开始绘制3D图形之前,本节我们将通过绘制一个三角形的程序来熟悉现代OpenGL的概念和流程。

3、使用索引绘图(index drawing)

熟悉了OpenGL绘图的中基本的VAO和VBO,以及着色器,并绘制了一个三角形。本节在上一节基础上,介绍利用EBO的索引绘图。

4、缓冲对象相关函数的使用(buffer object function usage)

OpenGL中还包含除了我们前面介绍的VAO,VBO,EBO等其他类型的缓冲对象。关于如何使用这些缓冲对象的手册或者参考书籍上解释得非常详细,但是阅读起来确实很枯燥无味。
本文将通过简洁、可靠的例子说明一些重要方法的使用,以辅助学习这些方法。本文的目的不是写成详细而厚重的手册,对于文中未详细说明的部分,请参考官方文档。

5、几何着色器(geometry shader)

一直以来我们使用了顶点着色器(vertex shader)和片元着色器(fragment shader),实际上OpenGL还提供了一个可选的几何着色器(geometry shader)。几何着色器位于顶点和片元着色器之间,如果没有使用时,则顶点着色器输出到片元着色器,在使用几何着色器后,顶点着色器输出组成一个基础图元的顶点信息到几何着色器,经过几何着色器处理后,再输出到片元着色器。几何着色器能够产生0个以上的基础图元(primitive),它能起到一定的裁剪作用、同时也能产生比顶点着色器输入更多的基础图元。本节将学习几何着色器的基本用法

6、向量和矩阵(math-vector and matrices)

前面几节内容环境搭建,绘制三角形,以及使用索引绘制,让我们对现代OpenGL中绘图做了简单了解。要继续后面的部分,需要熟悉OpenGL中涉及的数学知识。因此本节开始介绍OpenGL中的基本数学。

7、坐标和变换(math-coordinates and transformations)

上一节介绍了向量和矩阵,本节将熟悉坐标、线性变换、仿射变换以及坐标转换等概念和计算方法,这些内容对后续的学习将会有很大帮助。部分内容不是OpenGL编程初学者所必须掌握的,可以在以后需要时再回头来看。

8、二维纹理映射(2D textures)

前面两节介绍了向量和矩阵,以及坐标和转换相关的数学,再继续讨论模型变换等其他包含数学内容的部分之前,本节介绍二维纹理映射,为后面学习做一个准备。纹理映射本身也是比较大的主题,本节只限于讨论二维纹理的基本使用,对于纹理映射的其他方法,后面会继续学习。

9、立方体纹理和天空包围盒(Cubemaps And Skybox)

之前学习了2D纹理映射,实际上还有其他类型的纹理有待我们进一步学习,本节将要学习的立方体纹理(cubemaps),是一种将多个纹理图片复合到一个立方体表面的技术。在游戏中应用得较多的天空包围盒可以使用cubemap实现。

10、环境纹理映射(environment mapping)

上一节初步学习了使用cubeMap创建天空包围盒,本节继续深入Cubemap这个主题,学习环境纹理贴图。

11、模型变换(model transformation)

前面为本节内容准备了向量和矩阵、线性变换等内容,本节开始学习OpenGL中的坐标处理。OpenGL中的坐标处理过程包括模型变换、视变换、投影变换、视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习。本节主要学习模型变换。

12、视变换(view transformation)

OpenGL中的坐标处理过程包括模型变换、视变换、投影变换、视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习。上一节模型变换,本节学习模型变换的下一阶段——视变换。到目前位置,主要在2D下编写程序,学习了视变换后,我们可以看到3D应用的效果了。

13、欧拉角实现第一人称相机(FPS camera with Euler angle)

上一节视变换(view transformation) ,介绍了相机的设置参数,并建立了圆形坐标系和球形坐标系下的相机位置随着时间改变的绘制立方体程序。程序中用户无法通过键盘和鼠标来和场景中物体交互,本节实现一个第一人称相机来更好地与场景中物体交互。

14、投影矩阵和视口变换矩阵(math-projection and viewport matrix)

前面几节分别介绍了模型变换,视变换,本节继续学习OpenGL坐标变换过程中的投影变换。这里主要是从数学角度推导投影矩阵。对数学不感兴趣的,可以稍微了解下,或者跳过本节内容。

15、坐标变换过程(vertex transformation)

前面几节分别介绍了模型变换,视变换,以及给出了投影矩阵和视口变换矩阵的推导,本节从全局把握一遍OpenGL坐标转换的过程,从整体上认识坐标变换过程。相关矩阵的数学推导过程请参考前面几节对应的内容。

16、光照基础(basic lighting)

上一节坐标变换过程,总结了OpenGL中顶点的处理过程。有了前面的基础,从本节开始,我们可以开始学习OpenGL中包括光照、模型加载等主题。光照是一个复杂的主题,本节学习简单的Phong reflection model.

17、光照中材质和lighting maps使用(material and lighting maps)

这一节隔了好久了,今天终于有时间写完。上一节光照基础学习实现了Phong reflection model,但是还存在不足,本节使用材质属性,以及使用diffuse map和specular map改善上一节的实现

18、Blinn-Phong光照模型

在前面基础光照部分,我们学习了Phong Shading模型,Blinn-Phong模型对Phong模型的镜面光成分进行了改进,虽然在物理上解释没有Phong好,但是能更好地模拟光照。

19、光源类型和使用多个光源(Light source and multiple lights)

上一节光照中使用材质和lighting maps介绍了使用材质属性和lighting maps使物体的光照效果能反映物体的材料特性,看起来更逼真。在前面的章节中使用的实际上都是一个点光源,本节将学习其他几种光源类型,以及在场景中使用多个光源。

20、模型加载初步-加载obj模型(load obj model)

前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解。但是到目前为止,我们通过在程序中指定的立方体数据,绘制立方体,看起来还是很乏味。本节开始介绍模型加载,通过加载丰富的模型,能够丰富我们的场景,变得好玩。

21、AssImp模型加载

上一节Obj模型加载作为模型加载的基础篇,介绍了模型中Mesh的概念,以及从Obj模型文件转换为OpenGL数据格式的方法。上一节绘制的结果还是很简陋,本节将给出上节承诺的酷炫的3D模型的加载方法:)。

22、创建更多的实例(instancing object)

前面我们学习了模型加载的相关内容,并成功加载了模型,令人十分兴奋。那时候加载的是少量的模型,如果需要加载多个模型,就需要考虑到效率问题了。渲染一个模型更多的实例,需要使用到实例化技术,就是本节要介绍的instancing object方法。

23、深度测试(depth testing)

上一节我们使用AssImp加载了3d模型,效果已经令人激动了。但是绘制效率和场景真实感还存在不足,接下来我们还是要保持耐心,继续学习一些高级主题,等学完后面的高级主题,我们再次来改进我们加载模型的过程。本节将会学习深度测试。

24、模板测试(stencil testing)

上一节介绍了深度测试,本节继续学习一个高级主题-模板测试(stencil testing)。模板缓冲同之前介绍的颜色缓冲、深度缓冲类似,通过它我们可以实现很多的特效,例如轮廓、镜面效果,阴影效果等。

OPENGL学习脚印相关推荐

  1. OpenGL学习脚印: 二维纹理映射(2D textures)

    写在前面  前面两节介绍了向量和矩阵,以及坐标和转换相关的数学,再继续讨论模型变换等其他包含数学内容的部分之前,本节介绍二维纹理映射,为后面学习做一个准备.纹理映射本身也是比较大的主题,本节只限于讨论 ...

  2. OpenGL学习脚印:立方体纹理和天空包围盒(Cubemaps And Skybox)

    写在前面 之前学习了2D纹理映射,实际上还有其他类型的纹理有待我们进一步学习,本节将要学习的立方体纹理(cubemaps),是一种将多个纹理图片复合到一个立方体表面的技术.在游戏中应用得较多的天空包围 ...

  3. OpenGL学习脚印: 帧缓冲对象(Frame Buffer Object)

    写在前面 一直以来,我们在使用OpenGL渲染时,最终的目的地是默认的帧缓冲区,实际上OpenGL也允许我们创建自定义的帧缓冲区.使用自定义的帧缓冲区,可以实现镜面,离屏渲染,以及很酷的后处理效果.本 ...

  4. OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function)

    OpenGL中还包含除了我们前面介绍的VAO,VBO,EBO等其他类型的缓冲对象.本文将通过简洁.可靠的例子说明一些重要方法的使用,以辅助学习这些方法.本文的目的不是写成详细而厚重的手册,对于文中未详 ...

  5. OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function usage)

    本文转自点击打开链接,作者是the fool OpenGL中还包含除了我们前面介绍的VAO,VBO,EBO等其他类型的缓冲对象.关于如何使用这些缓冲对象的手册或者参考书籍上解释得非常详细,但是阅读起来 ...

  6. OpenGL学习脚印:模型加载初步-加载obj模型(load obj model)

    写在前面 前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解.但是到目前为止,我们通过在程序中指定的立方体数据,绘制立方体,看起来还是很 ...

  7. OpenGL学习脚印:光源类型和使用多个光源(Light source and multiple lights)

    写在前面 上一节光照中使用材质和lighting maps介绍了使用材质属性和lighting maps使物体的光照效果能反映物体的材料特性,看起来更逼真.在前面的章节中使用的实际上都是一个点光源,本 ...

  8. OpenGL学习脚印: 投影矩阵和视口变换矩阵

    OpenGL中的视图可以利用照相机来进行比拟.产生目标的场景的变过过程类似于相机拍照.此步骤大概分为三个: 1)把相机固定在三角架上,并让它对准场景(视图变换) 2)对场景安排,使得各个物体在招片中的 ...

  9. OpenGL学习脚印:伽马校正(Gamma Correction)

    写在前面 由于CRT,LED等显示设备显示颜色时并非按照线性方式工作,因此我们在程序中输出的颜色,最终输出到显示器上时会产生亮度减弱的现象,这种现象在计算光照和实时渲染时对图形质量有一定影响,需要我们 ...

最新文章

  1. iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)
  2. 【CTF】实验吧 围在栅栏中的爱
  3. 哈佛CASTER | 基于化学子结构表征预测药物相互作用
  4. 计科系大一c语言期末考试题,大一大学计算机基础期末考试试题「附答案」
  5. 实用教程:如何制作学术会议Oral/Spotlight Video?
  6. 管理实践-教练技术的应用
  7. one-hot encoding 并非分类变量编码的唯一选择
  8. server sql 无法从long转为int_MySQL中,21个写SQL的好习惯(修正版)
  9. c++ 箭头符号怎么打_C++随笔
  10. 上传本地代码到github
  11. c语言禁止窗口关闭,无法关闭窗口的程序
  12. [转] Async/Await替代Promise的6个理由
  13. matlab及机器学习
  14. 用React实现基于Canvas的图片放大镜功能
  15. 高中计算机会考vb试题,高中信息技术考试vb程序题及答案
  16. 海康威视摄像头密码重置方法
  17. 产业驱动消费升级 百果园获品途 2018“商业变革影响力”奖
  18. 如何在AD软件中创建自定义区域铺铜
  19. 【LabVIEW小技巧】LabVIEW自定义系统按钮时图片项设置说明
  20. 【小程序源码】圣诞节头像框制作生成支持多模板

热门文章

  1. Android 子线程更新主线程UI视图
  2. 产品经理经常遇到的诸多问题(一)
  3. 洛谷 P3674 小清新人渣的本愿 bitset+莫队
  4. RuntimeError: 1only batches of spatial targets supported (non-empty 3D tensors) but got targets of s
  5. Arcgis加载在线地图(内涵各种在线地图)
  6. 真心相爱要做的21件事
  7. hdfs missing blocks corrupt blocks
  8. Android 格式化分区命令
  9. 全球银行市值排行榜:工建中排名前三
  10. Python视觉深度学习系列教程 第三卷 第2章 什么是ImageNet?