a). 什么是纹理

一种可供着色器读写的结构化存储形式(采样器变量的形式,sampler)

b). 纹理管线

纹理管线

模型空间位置投影函数(不同与摄像机投影矩阵,是展UV其中一步)→纹理映射纹理坐标通讯函数新纹理坐标纹理采样(避免依赖纹理读取,如果片元着色器中不是使用顶点着色器中传递的数值,而是经过计算,那么就会产生依赖纹理读取,影响性能。因此,uv的偏移通常在顶点着色器中完成)→纹理值

纹理管线eg

c). Wrap Mode

  • 简介:
    • 决定uv[0, 1]以外的表现
    • OpenGL —— 包装模式(Wrapping Mode)
    • DirectX —— 纹理寻址模式(Texture Addressing Mode)
  • 类型:
    • Repeat
    • Mirror
    • Clamp
    • Border

Warp Mode

d). Filter Mode

  • 在不同形状、大小、缩放比时,纹理过滤模式,可由专用硬件实现,也可由软件中实现,也可软硬件搭配完成

d.1) 放大(Magnification)

  • 最近邻(性能消耗小,放大时每个像素读取最邻近的纹素,可能出现马赛克像素风格)
  • 双线性插值——对于每一个像素点都寻找邻近的四个像素点(实际),在二维空间进行的线性插值得到的最终混合值
    • 双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多
    • 双线性插值
    • $P(u,v)$是屏幕空间的坐标,屏幕空间左下角为$(0, 0)$,而左下角第一个像素的像素中心坐标为$(0.5, 0.5)$
    • The Center of the Pixel is (0.5,0.5)
  • 立方卷积插值
    • 立方卷积插值
  • 兰索斯插值(不常见,性能开销大)
  • Quilez 的光滑曲线插值 —— 在立方卷积插值与双线性插值的一个折中效果,画面表现效果要比双线性插值好,比立方卷积插值差
    • 光滑曲线插值
    • 在纹理坐标带入到双线性插值过程之前再额外进行了一步处理
    • 光滑曲线插值eg
  • 效果对比:效果对比

d.2) 缩小

FilterMode缩小

  • 可能出现的问题:出现颜色丢失与闪烁(奈奎斯特定律)

  • 解决方式:

    1. 最邻近、双线性插值(有限地增加采样频率)
    2. Mipmap(减小纹理频率)
阅读全文 »

a). 动画基础知识

动作01

  • 蒙皮: 定义骨骼数据如何驱动顶点数据;

    Skinning

    • 引擎内不支持双四元数蒙皮,那使用线性混合蒙皮如何改善关节形状:
      1. JCM(Maya中叫PSD):性能开销相对大;
      2. RBF:加几根辅助骨骼;

b). 动画类型

  • 逐帧动画:sprite(精灵)动画

  • 骨骼动画:3D动画、spine动画(2D骨骼)

  • 顶点动画:物理模拟后的动画数据,不便于用骨骼驱动,如布料,流体、破碎等

    • VAT(Vertex Animation Texture)

      VAT(Vertex Animation Texture)通常包括两张纹理:PositionTexture和RotationTexture。他们分别记录了一个Mesh在指定帧数下的位置、旋转变化。VAT的行坐标表示动画帧索引,列坐标表示对应顶点的位移数据。因此,VAT的高度一般对应整个动画的总帧数,而宽度对应着Mesh中根据Animation变化的顶点数。(https://zhuanlan.zhihu.com/p/585471941)

    • Shader顶点动画

    • 离线顶点动画

    • …….

阅读全文 »

a). 简介

MVP矩阵分别是模型(Model)观察(View)投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么:MVP

b). M: 模型空间→世界空间

  • 变换顺序

    1. 缩放
    2. 旋转
    3. 平移

c). V: 世界空间→观察空间

  • 变换顺序:
    1. 平移
    2. 旋转
    3. Z分量取反(观察空间采用的是右手坐标系,而Unity则是左手坐标系)

d). P: 观察空间→裁剪空间

  • 不是真正的投影,为投影做准备
  • 目的:判断顶点是否在可见范围内
  • P矩阵:对x,y,z分量进行缩放,用w分量做范围值。如果x,y,z都在w范围内,那么该点在裁剪空间内。

d.1) 正交矩阵

d.2) 透视矩阵

TODO: 推导各项矩阵

e). 光栅化补充

  • 三角形设置:得到图元的边界条件,并对边进行插值;
  • 三角形遍历:对单行进行插值

a). Photorealistic vs. Non-Photorealistic

Photorealistic Rendering

PhotorealisticRendering01

Non-Photorealistic Rendering

NPR01

  • 描边
  • 色块(量化Quantization 颜色)
  • 风格化阴影

b). Outline Rendering

Outline01

  • 边界(B, 属于剪影的线,但只属于一个面)
  • 折痕(C)
  • 材质的边界(M)
  • 轮廓(CS, 属于剪影的线,且有多个面共享)
阅读全文 »

a). Screen Space Ambient Occlusion(SSAO)

a.1). Introduction

  • SSAO:屏幕空间中,对全局光照的近似;
  • Key idea:

    1. 假设各方向间接光照的强度相同(类似于Phong模型中的Ambition light)

    2. 考虑不同着色点,有不同的Visibility

      SSAO_Intro01

    3. 假设材质为diffuse

    4. 假设间接光照来自于比较远的地方。因此,橙色的光线,即一定范围内不被遮挡的光线会贡献间接光。(如假设间接光来自比较近的地方,则是红色射线方向贡献间接光)

      SSAO_Intro02

a.2). Theory

SSAO_Theory01

  • 通过不等式,拆分渲染方程为:

    SSAO_Theory02

    • $k_A$ 项代表不同方向Visibility的(加权)平均
    • 黄色框可用一个Constant color表示

      • 假设了间接光 $L_i^{indir}$ 各方向强度相同,因此为常数;
      • 假设了材质为Diffuse,因此BRDF为常数;
      • $cos\theta$ 半球积分为$\pi$
    • 同样,因为黄色框,即$g(x)$为常数,其Support极小。因此,应用该不等式是精确

  • A deeper understanding 1:
    • SSAO_Theory03
  • A deeper understanding 2:(为什么Visibility项会有$cos\theta$)

    SSAO_Theory04

    • 加上 $cos\theta$ 的含义是把积分域从单位半球投影到单位圆上(Projected solid angle);

      SSAO_Theory05

    • 为什么要这么做呢?

阅读全文 »

a). Introduction

  • In RTR, people seek simple and fast solutions to one bounce indirect illumination

GI00b

  • Primary LIght Source(真正的光源,太阳)

  • Secondary Light Source(次级光源,Q点)

    GI00a

  • 观察(要得到$p$点的间接光照我们需要做什么):
    1. 得到Secondary light source(哪些点被光源照射到)
      • 方法: Shadow Mapping
    2. 得到各个Secondary light source对 $p$点 Radiance的贡献
      • 方法: 解渲染方程
  • 以下是实时渲染中常用的在3D空间中(意为渲染效果不取决于相机位置/屏幕空间)的GI方法(主要针对one bounce indirect illumination):
    • Reflective Shadow Maps (RSM)
    • Light Propagation Volumes (LPV)
    • Voxel Global Illumination (VXGI)

b). Reflective Shadow Maps (RSM)

GI00a

  • 得到Secondary light source(哪些点被光源照射到)
    • Shadow map中每一个Texel都是一个作为Secondary light sourc的面片(Surface patch)
      • Shadow map做阴影中是光源视角的$Depth$,和相机视角的比较;这里是光源视角的$Depth$和 点$p$ 视角比较
  • 得到各个Secondary light source对 $p$点 Radiance的贡献
    • 但是,对于不同的 点$p$ 次级光源入射方向是不一定的。即,即使观察角度固定,同一个Shadow map中的Surface patch,对不同的 $p$ 贡献不同;
  • 假设:
    • 次级光源均为Diffuse(观察角度固定,同一个次级光源对不同 点$p$ 的贡献相同)
    • Therefore, outgoing radiance is uniform toward all directions

b.1). 得到各个Secondary light source对 $p$点 Radiance的贡献

RSM_01a

  • 对于每个diffuse reflective patch(点$q$)

    • 点$q$ 的BRDF: $f_{rq} = \rho/\pi$

    • $L_i(q\rightarrow p) = f_{rq} \cdot \frac{\Phi}{d A}$ ( $\Phi$ 是光源的辐射通量,将该式带入渲染方程,${d A}$ 被消除)

      • ${||x-x_{q}||^{4}}$ 是因为分子上$x-x_{q}$是未归一化的向量;
      • $\Phi_p$ 为 $f_{rq} \cdot {\Phi}$
      • 将$E_p(x,n)$ 乘上 点$p$ 的BRDF即可得出$L_o$
      • $V$:Visibility项就不算了
  • Not all pixels in the RSM can contribute

    RSM_04

    • Visibility (难处理,不管了)

    • Orientation(方向,Reflector的反射方向只在法向半球上,法向半球的方向覆盖不到的Shading Point自然不受该Reflector的影响)

    • Distance(只有和Shading Point近的Reflector才做贡献)

      • 假设: 世界坐标下,两点接近 $\rightarrow$ Shadow Map(世界空间转换到光源空间)中距离比较近,且深度相差不大;

      • 进一步加速(类似于Step 1 and 3 in PCSS),在shading point转换到Shadow Map后对应点$(s,t)$ 的一定范围内,做随机采样

        RSM_Distance

b.2). 光源视角下储存的信息(Shadow Map)

RSM_Record

  • 深度
  • 世界坐标
  • 法线
  • 辐射通量(flux)
  • etc.

b.3). Pros And Cons

  • Pros:
    • 好写(类似于Shadow Map)
  • Cons:
    • 计算量随光源(Primary Light Source)数量增多线性增加
    • Visibility无法处理
    • 很多假设:diffuse reflectors, depth as distance, etc.
      • 只能处理次级光源为Diffuse
    • 质量依赖于采样率
阅读全文 »

a). PBR模型

基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型。

PBR_model

a.1). 两种工作流

游戏资源中常见的贴图类型

PBR Guide

PBR流程中,常用的有两种工作流程:

  • 金属/粗糙度工作流(Metal/Roughness)
    • 符合直觉,容易调参
    • 更不容易打破能量守恒
  • 高光(镜面反射)/光泽度(Specular/Glossiness)工作流
    • 可自由调节$F_0$(零度菲涅尔反射)值
    • 容易打破能量守恒

a.2). F0反射率值

F0

大多数常用的电介质的F0范围从0.02-0.05(线性值)。对于导体,F0值 范围为0.5-1.0。因此表面的反射率由折射率决定,正如下面的方程式所示(Lagarde 2011)。

F0a

F0_eg

图1. 金属和非金属的$F_0$​值

F0_D_M

图2. 电介质$F_0$值和金属反射率值
  • 通用贴图:法线贴图、AO贴图、高度贴图等
阅读全文 »

a). 布线合理性

  • 动画角度:

    横平竖直,均匀清晰,结构线密度足够(动画线一般为三根)(动画线即关节线:脖子,肩膀,肘关节,腰,膝关节,踝关节),由于肘关节和膝关节一般是单向弯曲,所以在面数有限的情况下,也可以使用前三后二的布线

  • 模型角度:

    尽量把线使用在体现剪影上,单纯的在平面上加线是没有意义的,平面上的细节会在之后的制作中用法线来体现

注意事项1:多星点

多星点

多星点(度大于4的顶点):如果是在中模阶段,减少使用多星点,因为会在细分时出现凸点的问题,如果要使用多星点,请通过布线技巧把它移动至平面处,不要让它出现在倒角边缘

在模型上挖洞,且要保证都是四边面的情况下,是必然会出现五星点的,五星点不可避免,但可以优化。也有把五星点转换为假四边的方法(模型师把这种布线叫做假四边)

五星点同样会影响点法线。 如使用了面积权重,那可能会导致点法线发生偏移。

五星点_点法线

五星点_点法线2

注意事项1:预连接

对于”不在同一个平面“的四边形,不同软件的预连接是不同的。 所以如果四边形的四个点不在一个平面里时,请连接对角线,否则会出现如下图情况,这个同样会影响到之后的法线烘焙。

预连


阅读全文 »

a). 什么是硬表面

硬表面01

硬表面02

  1. 从外表/建模来说:有着重工业质感、该平滑的时候平滑,该硬朗的时候硬朗。即平的平,弯的弯。

  2. 从光影来说:光影变化均匀,硬朗,有经过打磨的感觉。

需要区别于LowPoly,Lowpoly有种纸片的拼凑感,更像是纸膜,主要是倒角所给予硬表面的厚度。即缺少最重要的倒角。

Lowpoly

b). 如何制作硬表面(高模上倒角方法)

硬表面_倒角01

  • 在游戏中硬表面通常是使用低模进行体现。因为硬表面的质感很大程度上取决于倒角。倒角会很大的增加模型面数。对于一些较小的结构,小凹槽,实际在低模上进行倒角或者卡边做出结构是不太划算的。本质上是要让高光的呈现更加集中,如果高光过于散开,就会显得较软,漂亮的高光边会表现很强的质感。

    硬表面_倒角02

b.1). 卡双线

卡双线

第一对线用于Smooth后形成倒角,第二对线用于收敛高光

b.2). 方倒角

方倒角

对两个倒角卡双线

b.3). 直接倒角

效果最好,可得到漂亮的高光边,但是因为增加的边数很多,过于密集,修改起来麻烦。

b.4). 光滑组(软硬边)+ 卡单线

光滑组00

通过将两个面设为同一光滑组(Maya里则将连接边设为软边)+ 两边各卡一条线用于收敛高光区域

光滑组的本质: 改变点法线

光滑组的本质是改变点法线,进而影响面法线,进而影响三角线遍历中Normal的插值;

Hard_VertexNormal

Soft_VertexNormal

阅读全文 »