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
- DirectX
- 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:软件模拟
- Needed multiple GPUs for debugging GLSL
- 现在
- Nsight Graphics (cross platform, NVIDIA GPUs only)
- 和 visual studio 分开的,跨平台
- RenderDoc (cross platform, no limitations on GPUs)
- 软件,对 GPU 类型没有要求
- Nsight Graphics (cross platform, NVIDIA GPUs only)
经验
- 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
- 是否把 \(\cos\theta_i\) 这一项合入
BRDF
- 实时渲染的理解:显式考虑 visibility
- 环境光照:Environment Lighting
- cube map
- circle map
- 全局光照 = 直接光照 + 间接光照
- 直接光照:direct illumination
- 间接光照:indirect illumination
- one-bounce
- two-bounce
- \(\cdots\)
- 实时渲染的理论基础
- one-bounce 之后效果就好了很多,之后的添加只是在细节上更好
- 实时渲染主要就是模拟 one-bounce 的间接光照