a). Review Z-test

  • 先回顾下深度测试

ZTest_Workflow

  • 问题: 被遮挡的物体也会进行shading,造成overdraw;

    Overdraw

    • 解决思路: 在shading前提前剔除被遮挡的片元;

b). Early-Z

Early-Z

  • 是在传统管线中的光栅化阶段之后、片元着色器之前加的一步操作。
    • 提前的深度测试叫作Z-Cull
    • 后续的深度测试为了确定正确的遮挡关系,叫作Z-Check
  • Early-Z同样可以搭配使用模板测试

b.1). Early-Z失效情况

  1. 开启Alpha Test或 clip/discard等手动丢弃片元操作
    • 通常Early-Z不仅会进行深度测试,还要进行深度写入
    • 那在这种情况下,如果经过AlphaTest,前面渲染的片元被丢弃了(但写入了深度),那么后续的像素都将无法正常渲染。
  2. 手动修改GPU插值得到的深度
  3. 开启Alpha Blend
  4. 关闭深度测试Depth Test

b.2). Early-Z排序

不透明物体由远往近渲染,early-z将没有任何优化效果

  • 在渲染前,将不透明物体从近往远渲染的话,Early-Z能发挥最大的性能优化(注意此处还是前向渲染的思路)
  • 具体怎么排序?

    • 可以让CPU将物体按照由近到远的顺序排好,再交付给GPU进行渲染
  • 问题:

    • 复杂的场景,CPU性能消耗很大
    • 严格按照由近到远的顺序渲染,将不能同时搭配批处理优化手段。
  • 解决方法:Pre-Z / Z Prepass

阅读全文 »

一、两者的应用列举

1-1.曲面着色器的应用

①海浪、雪地等

    • img
    • 如右图一样,将一条直线进行细分,向一条曲线慢慢逼近

②著名的应用:和置换贴图(DIsplacement mapping,也叫位移贴图)结合使用

    • img
  • 使用普通法线的模型,在边缘部分的凹凸感会不理想

  • 如果使用置换贴图,因为它是真正改变物体的形状,所以边缘部分的凹凸感就会很真实
  • 注意:使用置换贴图,对模型的面数有要求。

  • 正是这个原因,让它和曲面细分着色器有着很好的契合度。

③雪地里出现的脚印

  • 可以用曲面细分着色器进行优化

1-2.为什么不用复杂的模型,而要用曲面细分着色器?

  • 曲面细分着色器可以根据距离/一些规则,动态的调整模型的复杂度,带来更好的性能。
阅读全文 »

  • GPU逻辑管线
  1. 程序通过图形API(DX、GL、WEBGL)发出drawcall指令,指令会被推送到驱动程序,驱动会检查指令的合法性,然后会把指令放到GPU可以读取的Pushbuffer中。
  2. 经过一段时间或者显式调用flush指令后,驱动程序把Pushbuffer的内容发送给GPU,GPU通过主机接口(Host Interface)接受这些命令,并通过前端(Front End)处理这些命令。
  3. 在图元分配器(Primitive Distributor)中开始工作分配,处理indexbuffer中的顶点产生三角形分成批次(batches),然后发送给多个GPCs。这一步的理解就是提交上来n个三角形,分配给这几个GPC同时处理。
  4. 在GPC中,每个SM中的Poly Morph Engine负责通过三角形索引(triangle indices)取出三角形的数据(vertex data),即图中的Vertex Fetch模块。
  5. 在获取数据之后,在SM中以32个线程为一组的线程束(Warp)来调度,来开始处理顶点数据。
  6. SM的warp调度器会按照顺序分发指令给整个warp,单个warp中的线程会锁步(lock-step)执行各自的指令,如果线程碰到不激活执行的情况也会被遮掩(be masked out)
  7. warp中的指令可以被一次完成,也可能经过多次调度,例如通常SM中的LD/ST(加载存取)单元数量明显少于基础数学操作单元。
  8. 由于某些指令比其他指令需要更长的时间才能完成,特别是内存加载,warp调度器可能会简单地切换到另一个没有内存等待的warp,这是GPU如何克服内存读取延迟的关键,只是简单地切换活动线程组。
  9. 一旦warp完成了vertex-shader的所有指令,运算结果会被Viewport Transform模块处理,三角形会被裁剪然后准备栅格化,GPU会使用L1和L2缓存来进行vertex-shader和pixel-shader的数据通信。
  10. 接下来这些三角形将被分割,再分配给多个GPC,三角形的范围决定着它将被分配到哪个光栅引擎(raster engines),每个raster engines覆盖了多个屏幕上的tile,这等于把三角形的渲染分配到多个tile上面。也就是像素阶段就把按三角形划分变成了按显示的像素划分了。
  11. SM上的Attribute Setup保证了从vertex-shader来的数据经过插值后是pixel-shade是可读的。
  12. GPC上的光栅引擎(raster engines)在它接收到的三角形上工作,来负责这些这些三角形的像素信息的生成(同时会处理背面剔除和Early-Z剔除)。
  13. 32个像素线程将被分成一组,或者说8个2x2的像素块,这是在像素着色器上面的最小工作单元,在这个像素线程内,如果没有被三角形覆盖就会被遮掩,SM中的warp调度器会管理像素着色器的任务。
  14. 接下来的阶段就和vertex-shader中的逻辑步骤完全一样,但是变成了在像素着色器线程中执行。 由于不耗费任何性能可以获取一个像素内的值,导致锁步执行非常便利,所有的线程可以保证所有的指令可以在同一点。
  15. 最后一步,现在像素着色器已经完成了颜色的计算还有深度值的计算,在这个点上,我们必须考虑三角形的原始api顺序,然后才将数据移交给ROP(render output unit,渲染输入单元),一个ROP内部有很多ROP单元,在ROP单元中处理深度测试,和framebuffer的混合,深度和颜色的设置必须是原子操作,否则两个不同的三角形在同一个像素点就会有冲突和错误。

https://www.cnblogs.com/anesu/p/15807749.html#/c/subject/p/15807749.html

a). 基本概念

HDRandLDR

  • 因为HDR可超过1,又被叫做浮点图像SP_HDR

    • 也因为HDR可超过1,bloom会有较好的表现;

      HDR_Bloom

b). Unity中的HDR

  • Camera

    Cam_HDR

  • Lightmap

    Lightmap_HDR

  • 拾色器

    拾色器_HDR

  • Unity中HDR的优缺点:

    优缺点_HDR

c). Bloom

  • 基础做法: 后处理中,选取高于一定亮度的像素区域,进行Blur(高斯模糊之类的),最后进行叠加;

  • Unity中的做法:

    Unity_Bloom

d). Toon Mapping

  • 原因: 照相机和摄像机可以捕捉到HDR的影响,渲染过程中可以产生HDR的画面。这些内容如果需要显示到LDR的设备上,就需要一个称为tone mapping的过程,把HDR变成LDR。

  • ACES曲线:

    ACES_ToonMapping

  • ToonMapping算法:https://zhuanlan.zhihu.com/p/21983679

  • Lut:
阅读全文 »

  • 渲染时,着色器中计算颜色最好在线性空间下(从辐射度量学的角度来看,是计算radiance和Irradiance)

a). Unity中的色彩管理

https://docs.unity.cn/cn/current/Manual/LinearLighting.html

  • Unity中选择色彩空间为Gamma时,渲染管线将使用伽马颜色空间中存储的所有颜色(比如灯光的颜色)和纹理。着色器不会对输入的贴图做sRGB采样,同时也不会对灯光颜色进行伽马转线性

  • Unity中色彩空间设置为Linear时,Unity会默认勾选sRGB,着色器会对勾选sRGB的进行sRGB采样(伽马转线性),详见后图

    选择 Color Space: Linear 将假设纹理位于伽马颜色空间内。Unity 在默认情况下使用 GPU 的 sRGB 采样器从伽马颜色空间跨越到线性颜色空间。如果纹理是在线性颜色空间内创建的,则需要绕过 sRGB 采样。请参阅有关使用线性纹理的文档以了解更多信息。

    Hardware

  • SP-U3D(SP的新版色彩管理OpenColorIO非常好,不清楚就去看看)

    SP_U3D

  • PS-U3D

    PS_U3D

    • PS的色彩管理

      PS_ColorManage

      PS_ColorManage2

a). Bump Map的分类

BumpMap00

b). Normal Map

  • 法线贴图:存有物体局部(切线空间)表面法线信息的一张贴图

Link1 NOTE.md

Link2

  • 储存空间:
    • (一般采用)切线空间
    • 模型空间

b.1). Tangent Space

Link3 切线空间(Tangent Space)

  • 切线空间中,x轴为切线,y轴为副切线,z轴为表面初始法线

    TangentSpace00

    • 其中,切线的方向对应UV空间的 $u$ 轴,副切线对应 $v$ 轴(详见Link1、Link3)
  • 使用切线空间的优点:

    1. 自由度高,可复用
    2. 可进行uv动画
    3. 可压缩

c). Unity中的法线压缩格式

UnityNormalZip

阅读全文 »

图形2.4 传统经验光照模型

  • Lambert

  • Phong

  • Blinn-Phong

    • Blinn-Phong对比Phong的优点:

      1. halfDir好计算

      2. 半角向量和法线点乘不会截断(saturate),即夹角总小于90°,不会断层

        Blinn-Phong Half

  • Cubemap:texCubelod

a). 渲染管线与模型基础

1.图形渲染管线
在这里插入图片描述
一如既往熟悉的渲染管线,蓝色背景的都是可编程的,稍微复习下:

  • 顶点着色器:将顶点坐标从模型空间转换到齐次裁剪空间,我们可以通过在顶点着色器中改变顶点位置实现动画;(可参考实战篇中的幽灵小人) ;
  • 片段着色器:将光栅化阶段所插值的模型信息进行计算,可以进行一些光照计算;

2.模型的实现原理

先是点,点连成线,线构成面,最后组合成多边形模型。

在这里插入图片描述
3.UV
在这里插入图片描述

在建模过程中,有一部非常重要的操作,就是展UV,那么UV是个啥?

  • 通俗地理解,展UV可以理解为将原本是三维的模型给全部剪开成面,平铺好的所有面放在一个以U轴(横向)和V轴(纵向)为坐标轴的正方形里就是UV,UV上的点和三维模型上的点一一对应,其位置就是顶点的纹理坐标。比如小学美术课用卡纸做骰子,将其拆开可以直接拆成六个面,这个过程就叫展UV。当在这个面上绘制数字时,对应的最后做好的骰子也会有所显示,这一步就是在UV上绘制贴图。
  • UV展好的话,其表现平整干净,就像是直接从模型上扒下来的纸张,展不好的话,其效果表现就是扒下来的纸张像是叠了好几次,皱皱巴巴的。
  • 在片段着色器阶段,利用纹理坐标可以获取贴图所存储的信息。
  • 展开好后的UV,一般利用Substance Painter(简称SP,次时代建模流程必备工具),BodyPainter(老一代的绘制贴图工具),Photoshop(PS绘图没啥好说的,SAI估计也行和PS同理);
  • 绘制贴图不仅仅只输出一个简单的颜色贴图,根据项目需求还需要法线贴图,金属度贴图,AO贴图等。各种贴图存储的信息不同,所占据的通道有多有少。
    所以我们还可以将一些通道不够占满RGBA的贴图进行整合,放在一张贴图里的不同通道,达到采样一次,获取多个信息的目的,可以有效提高性能。常见的如将没有透明度,仅存储RGB的颜色贴图与AO贴图压在一张图,AO贴图放在A通道。
    缺点是不同通道直接还是可能会有相互影响,但是不明显,按需取舍。
阅读全文 »