GAMES101-着色

48 阅读2分钟

Blinn-Phong Reflectance Model 光照模型 着色模型

着色(光照与基本着色模型)

着色和阴影无关

Shading:The process of applying a material to an object.

Blinn-Phong Reflectance Model 光照模型 着色模型

  • Diffuse

    • Lambertian (Diffuse) Shading

      • 几个变量:k_d, r, n, l
      • 光线的反射和我们的观察角度并没有任何关系。所以我们现在先考虑一种最简单的情况:入射光以及入射角度,那么入射角度与表面法线的夹角越小,就意味着反射越强:
    • 和view的方向无关

    Ld=kd(I/r2)max(0,nl)L_{d}=k_{d}\left(I / r^{2}\right) \max (0, \mathbf{n} \cdot \mathbf{l})

image.png

  • Specular

    • V close to mirror direction → half vector near normal

image.png - 几个变量:k_s, r, l, v, n, p - p一般100~200,控制高光大小

  • Ambient

    • 是假的

    La=kaIaL_{a}=k_{a} I_{a}

    • 提升亮度
    • 真的:全局光照(GI)十分复杂

合起来:

L=La+Ld+Ls=kaIa+kd(I/r2)max(0,nl)+ks(I/r2)max(0,nh)p\begin{aligned} L &=L_{a}+L_{d}+L_{s} \\ &=k_{a} I_{a}+k_{d}\left(I / r^{2}\right) \max (0, \mathbf{n} \cdot \mathbf{l})+k_{s}\left(I / r^{2}\right) \max (0, \mathbf{n} \cdot \mathbf{h})^{p} \end{aligned}

  • h是半程向量

Shading is Local:对某个点进行计算,局部,只看自己,不管其他物体的存在

光的能量密度的 平方反比定律

  • 点离光源的radiance

点离观察点的距离无关

镜面反射

image.png

image.png

image.png

image.png 左图:指数p是为了进一步缩小高光范围所提供的的参数,通常取值大于100

右图:不同光照强度和p的取值对高光效果的影响

环境光照

image.png

叠加效果

image.png

image.png

着色频率

Flat Shading(平面着色)

以三角面为单位进行着色,对于光滑的几何体效果很差

Gouraud Shading(高洛德着色)

以顶点为单位进行着色,通过插值计算,实现点与点之间颜色的平滑过渡

Phone Shading(冯氏着色)

以片元为单位进行着色,对每个点计算一次光照,点的法向量是通过顶点法向量插值得到的,冯氏着色最接近现实,可以在减少三角面数的情况下达到相同的效果(插值后法向量会光滑变化),当然,性能开销也非常大

图形管线(实时渲染管线)

从MVP变换将几何空间的顶点变换到屏幕上(Vertex processing),然后连线出三角形(Triangle processing),再通过光栅化(Rasterization)找到被几何体包住的像素点,即把这个三角形离散成为一堆像素点,有了像素点之后我们再通过深度测试和抗锯齿,给像素点渲染好对应的颜色。

image.png 顶点处理 -> 三角形处理 -> 光栅化 -> 片元处理 -> 逐片元操作

其中,Vertex和Fragment阶段是可编程的

由于翻译问题,具体可以参考《unity shader入门精要》p9 内容

GPUs: 可并行的图形管线处理器

当下的图形实时处理技术可以实时的处理200-400万面的复杂场景数据,并以30-60的帧率动态处理(VR的帧率会更加夸张)