总结

整本书看下来印象最深的就是搞明白了现代OpenGL的可编程管线,还有就是念着(zhuó)色器,而不是着(zháo)色器😅😅:

  1. 顶点着色器,对每个顶点调用一次,将顶点发送给管线的下一阶段
  2. 曲面细分着色器,分为曲面细分控制着色器曲面细分器曲面细分评估着色器。曲面细分控制着色器设置控制顶点的细分级别,并将这些信息传递给曲面细分器进行细分。曲面细分评估着色器对曲面细分器得到的每个顶点调用一次
  3. 几何着色器,对组成基本图元的一组顶点调用一次,可以修改图元、删除图元、添加图元和更改图元类型
  4. 片段着色器,几何着色器后将对顶点进行光栅化以得到屏幕上的像素,这一阶段是对像素进行操作,主要是设置像素的颜色

各章小结

第1章 入门,一些基础概念。

第2章 OpenGL图像管线,介绍了图像管线的组成,也就是前文总结的内容,但是如果不看完整本书其实很难记住这些顺序的。这一章中给出了一些简单的OpenGL着色器语言(OpenGL Shading Language,GLSL)示例,基本过程类似编译:

  1. glCreateShader()——创建某种类型的着色器
  2. glShaderSource()——绑定某种类型的着色器代码
  3. glCompileShader()——编译着色器代码
  4. glCreateProgram()——创建着色器程序
  5. glAttachShader()——将着色器代码加入程序对象
  6. glLinkProgram()——链接所有加入的着色器

第3章 数学基础,向量和矩阵。向量用来表示点,矩阵用来表示点的变换。一般在模型坐标系中定义组成模型的点,然后通过模型矩阵M将模型变换到世界坐标系,再通过视图矩阵V变换到观察点,最终通过投影矩阵P进行透视变换最终投影到屏幕上。

第4章 管理3D图形数据,使用GLSL渲染简单3D模型。上面这些矩阵可以写死在GLSL中,也可以通过同一变量的方式发送到GLSL中,具体方式为通过glGetUniformLocation()获取GLSL中定义的变量,然后通过glUniformMatrix4fv()发送到GLSL程序中。

第5章 纹理贴图,介绍了如何加载纹理并将纹理坐标发送到着色器,以及解决纹理伪影的方法。

第6章 3D模型,介绍了通过大量三角形生成球体和环面的方法。

第7章 光照,介绍了最常用的ADS光照模型。ADS分别为环境光反射(Ambient Reflection),漫反射(Diffuse Reflection)和镜面反射(Specular Reflection)。相应的,物体的材质也影响每种光的反射强度。实质上,光的颜色和材质都用RGB表示,某一像素经光照后的颜色由这三种光和材质经计算得到:

  • 环境光:环境光颜色和反射环境光材质的乘积
  • 漫反射:漫反射光颜色和反射漫反射光材质的乘积再乘cos(θ)θ为入射角
  • 镜面反射:镜面反射光颜色和反射镜面反射光材质的乘积再乘max(0, cos(φ)φ为观察点和反射光的夹角

存在两种实现光照的方法,分别为对顶点像素进行插值的Gouraud着色和对法向量插值的Phong着色:

  • Gouraud着色根据光照在顶点着色器中计算顶点的颜色并输出,然后在光栅化的过程中对每个颜色进行插值,最终在片段着色器中设置像素的颜色
  • Phong着色在顶点着色器中计算顶点的法向量和光照向量并输出,然后在光栅化的过程中对光照向量和法向量进行插值,最终在片段着色器中计算像素的颜色

第8章 阴影,介绍了(柔和)阴影的实现方法。加入光照后,如果没有投影出阴影,很难分辨出物体之间的相对位置。为了加入阴影,需要两次渲染操作:

  1. 第一次渲染从点光源处进行,计算每个像素的深度作为纹理,通过glBindFramebuffer()glFramebufferTexture()实现
  2. 第二次渲染从相机处进行,如果像素的深度浅于纹理深度,则按照完整的光照模型进行计算,否则将剔除漫反射和镜面反射分量

第9章 天空和背景。背景可借助OpenGL的GL_TEXTURE_CUBE_MAP实现,物体表面反射周围的场景可以通过使用反射向量查找环境贴图中的纹素实现。

第10章 增强表面细节,三种模拟表面凹凸不平的物体的方法:

  1. 凹凸贴图,对Phong着色插值后的法向量进行正弦调整
  2. 法线贴图,使用和纹理配套的法线贴图文件标识每个纹素的法向量
  3. 高度贴图,在纹理中存储高度信息,并用高度信息来调整顶点的位置

第11章 参数曲面,贝塞尔曲线和贝塞尔曲面的构建。

第12章 曲面细分,曲面细分着色器的使用。

第13章 几何着色器,介绍如何使用几何着色器修改图元、删除图元、添加图元和更改图元类型。

第14章 其他技术,包含:

  1. 雾,根据像素的远近和调整像素的颜色
  2. 混合,通过glBlendEquation()对片段着色器输出的源像素和帧缓冲区中的目标像素进行混合
  3. 用户定义裁剪平面
  4. 3D纹理,可以理解为从实际的三维原材料中雕刻出模型,而不是对透明的模型进行贴图
  5. 噪声及其应用,噪声的生成方法,还有通过噪声模拟大理石、木头、云和特殊效果

更多推荐

《计算机图形学编程(使用OpenGL和C++)》