跳过正文

Game101_part3

383 字·2 分钟 草稿

07 Shading part01 着色 部分1
#

Visibility/occlusion 可见性/遮挡
#

Z-buffering 深度缓存
#

Painter’s Algorithm 画家算法

先画远的物体, 再画近的, 剔除遮挡的远的部分

画家算法在一定情况下适用

存在以下情况不适用

  1. 物体在同一深度, 绘制顺序影响结果是否正确

  2. 物体互相有遮挡关系

因此无法使用画家算法, 而是使用Z-Buffer

去记录像素的深度, 而不是像画家算法那样给三角形的所有像素指定统一深度

Z-Buffer在生成图像的同时会生成一张深度图, 前者存在frame buffer, 后者在depth buffer(z-buffer)

为了简化计算, 下面的说明中, Z深度代表元素距离摄像机的距离, 且总是正的, 越小越近, 越大越远

深度算法流程

  • 初始化深度, 所有像素深度都是无限远的
  • 计算一个三角形覆盖的像素的深度
  • 如果获得的深度小于之前记录的深度, 覆盖它
  • 如果获得的深度大于之前记录的深度, 不更新

图解

Z-Buffer没有计算遮挡关系, 它是取最小深度值的算法. 它和顺序无关, 假设两个三角形有不同深度, 先算哪个都不会影响结果. 在图形学中, 使用浮点型这么一个精度来表示深度, 因此几乎不可能出现两个浮点型数字相同, 也就很大概率不会出现一个像素要对比两个相同浮点型数字的大小, 但仍然会出现, 这节课不讨论这个情况的处理方法

Shading 着色
#

字典定义:The darkening or coloring of an illustration or diagram with parallel lines or a block of color

课程定义:对不同物体应用不同材质的过程叫做着色

用blin-phong模型来描述着色

着色部分划分:Specular highlights, Diffuse reflection, Ambient lighting 高光, 漫反射, 间接光

着色具有局部性(只考虑物体本身着色, 不考虑相互遮挡产生的投影) shading ≠ shadow

漫反射 光线被均匀反射到各个方向去

shadingpoint的朝向和光线有一定夹角时, 得到的明暗不一样, nl夹角决定shadingpoint亮度

lambert’s cosine law 兰伯特余弦定律 shadingpoint接受的能量和nl夹角角度的余弦成正比

光的强度和光的传播距离有关

传播越远, 光的强度越弱, 和距离呈平方反比

先计算点光源和shading point距离, 算出到达shadingpoint的能量, 再计算夹角余弦, 算出有多少能量被接收, 就能知道漫反射的明暗

n·l的结果负值没有意义, 那意味着光方向从平面反方向进入, 不属于漫反射范畴, 所以要max(0, n·l)

定义系数kd, 如果为1, 表示完全不吸收能量, 如果为0, 意味着能量被全部吸收, 表面全黑, 把这个系数定义成rgb color, 这个值就是diffuse coefficient(color)

08 Shading part02 着色 部分2
#

Blinn Phong
#

Ls = ks (I/r^2)max(0,n·h)^p

和Lambert一样接收能量, 且由nh向量决定结果. ks系数决定高光颜色. 这是简化的模型, 没考虑反射的能量, 只考虑了接受了能量

指数P. 由于cosa会导致出现一个很大范围的高光, 所以需要一个指数来控制高光范围, 一般指数范围在100-200

h比r好算, 所以Blinn Phong在算法上比Phong便宜

Ambient
#

把环境光假设成四面八方到来且强度一致的光

La = ka Ia, 颜色*强度, 和l,v,n方向无关, 环境光是一个常数. 这是一个简化的形式

Shading Frequencies 着色频率
#

三种结果, 着色分别应用在面, 顶点, 像素上的区别

对应Flat shading, Gouraud shading, Phong shading(这里指的是着色频率而不是着色模型)

顶点法线算法
#

通过顶点周边的面法线进行一个平均

也可以通过两个顶点来计算出中间面的法线, 通过重心坐标

Graphics Pipeline 实时渲染管线/图形管线
#

从场景到最后显示结果的过程, 就叫管线

shading发生在Vertex Processing 和 Fragment Processing, 看在顶点进行着色, 还是在像素进行着色, 这根据着色频率来定

shader控制顶点和像素如何着色

shader是通用程序, 能够指定同一操作到所有像素

如果是顶点着色操作, 就叫Vertex Shader, 如果是像素着色, 就叫Fragment 或 Pixel Shader. 像素着色器负责定义像素的颜色计算和输出

gpu是高度并行化的处理器, 并行计算(不同像素同一算法)

Texture Mapping
#

任何三维物体表面是二维的平面

parameterization 参数化

一种研究方向, 让任意物体表面展开放置到一个平面, 保证扭曲最小化, UV切开处无接缝化

无缝纹理tiled texture, 其中一种算法叫Wang Tiling

09 Shading part03 着色 部分3
#

Barycentric coordinates 重心坐标
#

在三角形内做差值, 在三角形内部, 点与点之间做平滑的过渡.

可以做差值的元素, 基本上包含三角形包含的任意属性

Texture coordinates, colors, normal vectors,…

有个三角形ABC, 三角形内的任意点构成一个线性组合, 线性组合有3个系数, 系数之和为1. 三个系数要非负. 这三个系数组成重心坐标

三角形任意点可以通过面积比来计算出重心坐标

三角形的中心的重心坐标为1/3α, 1/3β, 1/3γ

做差值的属性通过重心坐标线性地组合起来

三维空间的属性, 差值必须在三维空间计算重心坐标再计算差值. 不能在投影后计算重心坐标. 因为重心坐标经过投影会改变

深度值属性则是先通过计算栅格化后的三角形像素中心, 再计算这个中心在三维空间三角形的内部位置, 在三维空间做深度差值, 再放回屏幕

Texture queries 纹理应用到渲染中
#

找到屏幕上所有采样点, 找到每个屏幕采样点对应的uv空间的坐标, 找到贴图对应坐标上的颜色, 都知道后, 把颜色应用到漫反射公式的Kd系数上

当屏幕像素和纹理像素不等时(比如有一个4096x4096的屏幕,展示一个256x256的贴图) 纹理上的像素称之为texel

这时会出现多个pixel采样同一个texel的情况(Nearest)

双线性差值 Bilinear Interpolation
#

假设一个高分辨率屏幕的一个像素映射到贴图的texel上, 寻找映射点临近的4个点, 计算这个点和其他四个点的水平垂直距离st, 对水平s做两次差值, 对两次差值结果再做一次差值t(垂直)

Bicubic
#

相比Bilinear, 取的是临近16个来进行差值

Point Sampling Textures Problem
#

纹理过大会出现问题, 如果仍然使用之前的方法, 远处会有摩尔纹, 近处会有锯齿

这是因为屏幕上的像素覆盖的纹理大小不同, 映射远处的情况, 会出现一个像素包含多个texel.

如果用MSAA方法/超采样, 开销太大

点查询: 之前提到的Bilinear就是

范围查询 range query 范围内的平均值是其中一种

当一个像素覆盖多个texel时, 取所有texel的平均值

Mipmap
#

Allowing( fast, approx, square) 允许快速, 不准确, 方形的范围查询

在处理纹理前生成Mipmap, 生成8个level时, 会多出1/3的贴图量

计算MipmapLevelD

先获得屏幕采样点和临近其他采样点的位置, 以及这些采样点映射到uv上的位置. 由此得到屏幕采样点们在屏幕上的相互距离, 以及在uv系中的相互距离

由此我们可以得到一个像素在texture里近似矩形的一个采样范围

如果这个矩形是1x1大小, 采用level0, 如果是4x4, 就是level2. 这是通过计算这个区域在第几层会变成一个像素的大小, 再去查那个层对应的像素, 就能知道像素的平均值

Trilinear Interpolation
#

如果直接从level0变成level1, 会出现接缝, 为了防止这种情况, 需要线性过渡, 也就是中间值. 通过双线性差值的方法, 先对相邻两层level做双线性差值, 把两个结果合在一块, 做层与层之间的差值, 被称为三线性差值

Mipmap Limitations: Overblur 远处过渡模糊

Anisotropic Filtering 各向异性过滤
#

效果比三线性插值要好

各向异性过滤相比三线性插值, 会多出两组水平缩放的图, 用于对长条形区域进行快速范围查询

各向异性过滤局限性: 查询的范围不规则,倾斜时, 依旧无法解决问题

开销是原本3倍

x代表压缩层数, 有上限, 开销3倍封顶

EWA filtering
#

对不规则形状, 拆分成多个圆形去覆盖不规则形状, 每次查询一个圆形, 多次查询

质量好, 代价大

Applications of texture
#

相关文章

草稿
Game101_part2
397 字·2 分钟
庄懂的技术美术入门课 - 前向渲染
2392 字·12 分钟
线性代数的本质 - 01
175 字·1 分钟