GAMES202.闫令琪.02.基础知识

  • https://www.bilibili.com/video/BV1YK4y1T7yY
  • Recap of CG Basics

基础知识回顾

硬件渲染管线

  • Basic GPU hardware pipeline

管线

  • vertex processing
  • triangle processing
  • rasterization
  • fragment processing
  • framebuffer operation

关键步骤

  • Model, View, Projection transforms
  • Sampling triangle coverage
  • Z-Buffer Visibility Tests
  • Shading
    • Blinn-Phong
  • Texture mapping & interpolation
    • 重心坐标系

其他问题

  • 纹理坐标的 \((u,v)\) 是怎么参数化出来的?
    • 立方体贴图的思维
    • 通用的要求
      • 纹理扭曲小
      • 纹理映射到物体之后,每个部分的拉伸尽量相近
    • 参数化问题
      • 困难的几何问题

OpenGL

  • Is a set of APIs that call the GPU pipeline from CPU
    • 一系列让 CPU 调用 GPU 的 API
  • 跨平台
  • 其他的 API
    • DirectX
      • Windows
    • Vulkan
  • OpenGL 的问题
    • 碎片化,版本更迭平缓,不同版本有不同的特性
    • C 风格,很难使用
    • 早先不能 Debug

OpenGL 的流程

一个类比(画油画)

  • A. Place objects/models
    • 放置物体 \(\leftrightarrow\) 模型位置,模型属性,模型变换的指定
  • B. Set position of an easel
    • 放置画架 \(\leftrightarrow\) 确定相机(视图变换),使用具体的哪一个 framebuffer
  • C. Attach a canvas to the easel
    • 固定一个画布 \(\leftrightarrow\) 在一个 framebuffer 里面可以生成好几张纹理图
    • multiple rendering target:支持渲染多张纹理
    • 双缓冲技术:先将图片渲染好,没问题之后再将其显示在屏幕上
      • 早期直接渲染到屏幕上会出现撕裂的问题(上一帧渲染到一半,下一帧就开始渲染了)
      • 垂直同步打开:不会有撕裂的问题
      • 垂直同步
        • 打开后能防止游戏画面高速移动时画面撕裂的现象
        • 打开后如果你的游戏画面 FPS 数能达到或超过你显示器的刷新率,这时你的游戏画面 FPS 数被限制为你显示器的刷新率
  • D. Paint to the canvas
    • 在画布上画画 \(\leftrightarrow\) shading(vertex/fragment shader),rasterization
    • vertex/fragment shader:并行
  • E. (Attach other canvases to the easel and continue painting)
    • 换一张画布继续画 \(\leftrightarrow\) 换一个 framebuffer 继续绘制
  • F. (Use previous paintings for reference)
    • \(\leftrightarrow\) Multiple passes,使用之前渲染得到的结果(纹理)

OpenGL 做的事

  • in each pass
    • Specify objects, camera, MVP, etc.
    • Specify framebuffer and input/output textures
    • Specify vertex / fragment shaders
    • (When you have everything specified on the GPU) Render!

OpenGL Shading Language (GLSL)

  • 描述着色器怎么运作的
  • 比较像 C 语言
  • 有很长的历史
    • 早期:GPU 上写汇编语言
    • SGI 时期:Stanford Real-Time Shading Language
    • Still long ago:Cg from NVIDIA
    • HLSL in DirectX (vertex + pixel)
    • GLSL in OpenGL (vertex + fragment)
  • 最终还是编译成汇编语言的

使用 shader

  • Create shader (Vertex and Fragment)
  • Compile shader
  • Attach shader to program
  • Link program
  • Use program

一些关键字

  • attribute:顶点属性
  • uniform:全局变量(CPU直接送过去)
  • varying:变量
    • vertex shader 中为插值前的顶点值
    • fragment shader 中为插值后的片元值
  • sample2D:采样器(纹理)
  • highp:表示高精度

Debugging Shaders

  • 早期:NVIDIA Nsight with Visual Studio
    • Needed multiple GPUs for debugging GLSL
      • GLSL:多 GPU 才行
    • Had to run in software simulation mode in HLSL
      • HLSL:软件模拟
  • 现在
    • Nsight Graphics (cross platform, NVIDIA GPUs only)
      • 和 visual studio 分开的,跨平台
    • RenderDoc (cross platform, no limitations on GPUs)
      • 软件,对 GPU 类型没有要求

经验

  • RGB 调试法
    • 想要输出一个值,可以把它作为颜色在屏幕中显示出来
    • 利用软件提取出颜色即可

渲染方程

  • The Rendering Equation

\[ L_o(p,\omega_o)= L_e(p,\omega_o) +\int_{H^2}f_r(p,\omega_i\to\omega_o)L_i(p,\omega_i)V(p,\omega_i)\cos\theta_id\omega_i \]

  • outging radiance = emission + \(\sum\) BRDF x incident radiance x visibility
    • 是否把 \(\cos\theta_i\) 这一项合入 BRDF
      • BRDF
      • cosine-weighted BRDF
  • 实时渲染的理解:显式考虑 visibility
  • 环境光照:Environment Lighting
    • cube map
    • circle map
  • 全局光照 = 直接光照 + 间接光照
    • 直接光照:direct illumination
    • 间接光照:indirect illumination
      • one-bounce
      • two-bounce
      • \(\cdots\)
  • 实时渲染的理论基础
    • one-bounce 之后效果就好了很多,之后的添加只是在细节上更好
    • 实时渲染主要就是模拟 one-bounce 的间接光照