以下为个人学习笔记整理,课程官网传送门作业传送门会议系统传送门

# Recap of CG Basics

  • Basic GPU hardware pipline
  • OpenGL
  • OpenGL Shading Language(GLSL)
  • The Rendering Equation
  • Calculus

# Graphics(Hardware) Pipeline

下图为渲染管线的渲染流程:

  • 【Input】输入的数据是一堆「模型上」的「顶点」。

  • 【Vertex Processing】经过一系列顶点的处理 ——MVP(Model、View、Projection),得到「屏幕上」的「顶点」

    • Model Transformation:模型上的顶点 -> 世界坐标上的顶点。
    • View Transformation:世界坐标 -> 摄像机坐标。可以理解为把摄像机作为原点,摄像机的观察方向作为 -z 方向,对空间坐标内的全部物体进行平移和旋转。平移和旋转的值就是从摄像机移动和旋转到原点 -z 方向的取反。
    • Projection:投影分为「正交投影」和「透视投影」。变换矩阵推导见:[Game101 的 Transformation Cont](https://allengx.gitee.io/computer-science/study/Game101 / 三、Transformation Cont/)
      • 透视投影:近大远小。
      • 正交投影:远近大小相同。
  • 【Triangle Processing】输入顶点连线,组成一个个的三角形。

  • 【Rasterization】得到三角形覆盖的屏幕上的像素点(计算深度值 z-buffer,抗拒锯齿处理等...)。

  • 【Fragment Processing】计算每个像素点对应的颜色。(Blinn-Phong 模型)光照计算公式推导见:Game101 的 Shading 部分

    • 高光(Specular)+ 漫反射(Diffuse)+ 环境光(Ambient)
  • 【Framebuffer Operations】经过其他的处理(拼接,组装)最终输出成图片。

pipeline

# OpenGL

OpenGL 是一个在 CPU 端调度 GPU 的 APIs。

# OpenGL 的一些基本概念

  • Vertex Buffer Object(VBO):GPU 中的一块区域,用于存储模型的一些数据,例如:
    • Model specification:用于描述模型的数据(顶点、顶点间的连线、法线,贴图,纹理坐标等....)
    • Model transformation:模型的摆放位置。
    • Model texture coords:模型的纹理坐标。
    • Model normals:模型的法线。
  • OpenGL functions:提供了各种矩阵的推导结果,例如 MVP。
  • Set up an easel:设置一个画架,其本质是定义一个观察视角(View transformation),或者说定义摄像机位置和朝向。
  • Attach a canvas to the easel:给画架一块画布(framebuffer),用于存放绘制结果。
  • Paint to the canvas:绘制图像,通过「顶点着色器」和「像素着色器」。
    • 在「顶点着色器」中对每个顶点的操作进行定义:
      • MVP 映射,各种插值结果
    • OpenGL 负责把顶点处理成像素(OpenGL 自己的光栅化)
    • 在「像素着色器」中对每个像素的操作进行定义:
      • 计算像素的颜色和光线
      • OpenGL 自己根据 z-buffer 进行覆盖。

# 需要我做些什么?🤔

  • 定义模型,摄像机,MVP。
  • 选择 framebuffer 和输入输出的纹理
  • 定义「顶点着色器」和「像素着色器」

# OpenGL Shading Language(GLSL)

LearnOpenGL 传送门

# Debug Shader

  • Nsight Graphics(NVIDIA GPUS only)

  • RenderDoc

# The Rendering Equation

光线追踪渲染方程推导见:[Game101——Ray Tracing](https://allengx.gitee.io/computer-science/study/Game101 / 十六、Ray Tracing——Basic radiometry/)

image-20210601175121000

# In real-time rendering(RTR)

实时渲染下的光线追踪方程:把「物体自身发出的光」+「照射到物体的间接光」计算转化为计算「所有光源能否经过反射或折射照射到物体」

  • visibility:用于描述物体是否能够看见四面八方的光源所引入的一个值。
    • 通过 visibility 的判定来实现光线追踪(有限的反射或者折射次数下,能否照射到物体)

image-20210601175601523

# 求解环境光变得简单

针对每个像素点,可以计算出所有光源的光线照射到该点的强度,并记录在贴图上缓存起来。

# Calculus

...