找回密码
 立即注册
查看: 318|回复: 0

图形学

[复制链接]
发表于 2022-6-21 09:00 | 显示全部楼层 |阅读模式
前言

参考的资料比较多,几乎是哪里不懂查哪里,也记不太清楚了,所以不写在这里了。
在文章中可以看到很多网上常见的图片,水印都在可以直接去查看原资料。
渲染管线

渲染管线的功能是通过给定虚拟相机、3D场景物体以及光源等场景要素来产生或者渲染一副2D的图像。 两个功能:一是将物体3D坐标转变为屏幕空间2D坐标,二是为屏幕每个像素点进行着色。 一般流程:顶点数据的输入、顶点着色器、曲面细分过程、几何着色器、图元组装、裁剪剔除、光栅化、片段着色器以及混合测试。

  • 顶点数据:为后面的阶段提供处理的数据。    顶点属性包括顶点坐标,顶点法线,纹理坐标,顶点颜色等。    图元信息包括点,线,线段,三角面等
  • 顶点着色器
  • 用MVP矩阵进行坐标变换。将局部坐标变换到世界坐标,观察坐标和裁剪坐标
  • 再将顶点的深度值z保存在顶点经过变换得到的齐次坐标的w分量中。
  • 顶点着色
  • 曲面细分(可选):对三角面进行细分,增加物体的三角面数量。    有细节层次机制,近物细节多,远物细节少
  • 几何着色器(可选):处理图元,可将输入的点或线扩展成多边形
  • 图元组装:将输入的顶点组装成指定的图元。进行裁剪,背面剔除相关的优化和屏幕映射的操作。
  • 光栅化:光栅化是个离散化的过程,将3D连续的物体转化为离散屏幕像素点的过程。光栅化会确定图元所覆盖的片段,利用顶点属性插值得到片段的属性信息,然后送到片段着色器进行颜色计算。
  • 片段着色器(像素着色器):决定屏幕上像素的最终颜色。在这个阶段会进行光照计算以及阴影处理,是渲染管线高级效果产生的地方。
  • 测试混合阶段:测试包括裁切测试、Alpha测试、模板测试和深度测试。通过测试的片段会进入混合阶段。



光照模型

漫反射和镜面反射的计算


  • 漫反射



  • 镜面反射:

    • 先计算出反射向量,然后再利用视角和反射向量计算镜面反射
    • 计算反射向量,计算量较大,于是聪明的科学家们就想到了模拟计算方式:半程向量。






半程向量

Lambert漫反射模型

粗糙的物体表面向各个方向等强度地反射光,这种等同度地散射现象称为光的漫反射。
Phong


  • Phong模型将物体光照分为三个部分进行计算,分别是:漫反射分量、镜面高光和环境光。
  • 其中,环境光分量是用来模拟全局光照效果的,其实就是在物体光照信息基础上叠加上一个较小的光照常量,用来表示场景中其他物体反射的间接光照。具体实现:环境分量,直接设置一个ambient分量,乘上光照颜色和物体颜色;漫反射分量,用光线到片段的向量与片段平面法线向量的点乘,乘上光的颜色和物体颜色;镜面分量,通过指数函数pow计算,有一个shininess分量,越大表示高光越尖锐,用到了视线方向和反射光线方向的点积。
  • Phong写实效果更好
  • 问题:当反射光与视线的夹角大于90度时,由于在实际渲染时余弦值总是被限制在[0,1],在这些地方上高光项没有任何贡献。当物体的反光度非常小时,高光半径就会非常大,在反射角与视线夹角为90度的区域附近就会出现很明显的断层现象。
Blinn-Phong光照模型


  • Blinn-Phong的高光范围要比Phong更大,算法简单,运行速度快,高光效果更平滑
  • 半角向量与法线夹角总不大于90度,使用Blinn-Phong模型时断层现象不会发生。


全局光照模型


  • 光线追踪
  • 路径追踪
  • 光子映射
剔除方法


  • 遮挡剔除
  • 视口剔除
  • 视锥体剔除(应用程序阶段):依据主要是根据摄像机的视野(field of view)以及近裁减面和远裁剪面的距离,将可视范围外的物体排除出渲染
  • 背面剔除(光栅化阶段):先判定多边形的朝向,并和当前的观察方向进行比较。
  • 深度剔除(early -z)
  • 背面,遮挡,视锥剔除的三种方法


用到的BUFFER


  • 颜色缓冲 (Color Buffer) :存储所有片段的颜色:即视觉输出的效果。
  • 模板缓冲 (Stencil Buffer) :为屏幕上的每个像素点保存一个无符号整数值。用于模板测试中。决定是否丢弃片段。
  • 顶点缓冲 (Vertice Buffer):管理顶点数组数据。
  • 深度缓冲 (Depth Buffer):处理图像深度坐标,确定渲染场景中哪部分可见、哪部分不可见的。
  • 帧缓冲 (Frame Buffer) :帧缓冲区是上面几种缓冲的合集,他可以保存其他确实有内存存储并且可以进行渲染的对象,例如纹理或渲染缓冲区。
AO


  • Ambient Occlusion 环境光遮蔽:环境光遮蔽是一种近似于光线因遮挡而衰减的效果,这是一种细微的表现,使角落,裂缝变得更暗,以创建一个更自然,现实的外观。环境光遮蔽的重要性仅次于全局光照,且与全局光照相互影响。
  • Screen-Space Ambient Occlusion 屏幕空间AO:AO方法的开销正比于场景复杂度,SSAO技术仅需要深度值z-buffer作为唯一输入,他们通过在每一个像素位置的单位球体内分布一系列测试点,并根据测试点的深度值估计出当前像素的 kA 项


对于绘制在屏幕平面上的每个片段,我们基于其周围的片段的深度值计算出一个遮蔽因数,这个遮蔽因数被用来减少或取消片段的环境光照组件的影响。

  • Horizon-based Ambient Occlusion 基于视角AO:HBAO将z-buffer视为一个连续的高度场,某个点的仰角可以估计其可见性,其切平面上的最大角度是被周围物体遮挡而产生的。因此对于着色点,我们要找到任一方向的最大的可视角度,如果忽略cos权重项,则 kA就相当于在仰角范围内未被遮挡区域的积分,或是1减去被遮挡住部分的积分



  • Shading with Ambient Occlusion AO着色
碰撞检测

包围盒


  • 包围盒算法是一种求解离散点集最优包围空间的方法
  • 基本思想是用体积稍大且特性简单的集合体近似代替复杂的几何体。
  • 最常见的包围盒算法有AABB包围盒,包围球,方向包围盒OBB以及固定方向凸包FDH
  • AABB包围盒



  • AABB 包围盒的碰撞检测


速度过快/体积过小导致物理引擎检测不到碰撞,如何解决。


  • 连续碰撞检测:在移动时先判断移动后的位置与现在的位置作射线检测,若有碰撞则移动失败否则移动成功。
  • 把Mesh包含在胶囊体里面,可以保证不会穿模。
MVP变换

(坐标系转化,正交投影,透视投影,视口变换)

  • 模型变换
  • 三维变换矩阵
  • 绕n轴旋转α角
  • 视口变换
  • 将摄像机放回原点
  • 将摄像机旋转至规范角度
  • 投影变换
  • 透视投影 = 压缩物体 + 正交投影








采样

迁移过来序号有问题,不影响查看

  • 判断采样点在三角形的内部:三次叉乘>0
  • 加速采样:AABB包围盒;每一行考虑最左最右
  • 抗锯齿/反走样:采样率不足

    • 图像替换(FXAA):找到边界,换成没有锯齿的边界
    • 超级采样抗锯齿(SSAA)



  • 特点:消耗性能,简单直接
  • 步骤:把图像放大,和附近的像素点混叠,还原到原来大小
<li data-pid="sChlfQHy">多重采样抗锯齿(MSAA)

  • 特点:只对图形边缘进行抗锯齿处理,消耗较小,但效果差些
<li data-pid="F8Oegv-G">覆盖采样抗锯齿(CSAA)

  • 特点:进一步高效执行边缘取样
  • 步骤:将需要取样的子像素覆盖掉,把原像素强制安置在硬件和驱动程序预先算好的坐标中
<li data-pid="TWW1hJBy">高分辨率抗锯齿(HRAA)

  • 步骤:取样点四点在正方形角上,一点在正方形中心
<li data-pid="UxbLvtGF">可编程过滤抗锯齿(CFAA)

  • 特点:可灵活选择边界大小的MSAA
<li data-pid="fXME2BJb">形态抗锯齿(MLAA)

  • 用边缘的前景和背景混合后的颜色填充边界像素
<li data-pid="1wcc6STr">快速近似抗锯齿(FXAA)

  • 是MSAA的高性能快速近似,只是单纯的后期处理着色器
<li data-pid="fxbGflSG">时间性抗锯齿(TXAA)

  • 将MSAA,时间滤波,后期处理相结合,呈现高保真度
<li data-pid="51WMi3G3">多帧采样抗锯齿(MFAA)

  • MSAA的优化,提升性能表现
深度处理


  • 画家算法:由远及近画画,覆盖。无法处理互相遮挡的情况
  • Z-Buffer
  • 对每个像素多存一个深度缓冲区
  • 不能处理透明物体
  • 深度测试 Z-Test (depth test):让传入片元的深度值与深度缓冲区对应值比较,判断是否符合给出的条件,不符合则舍弃该片元;符合则测试通过,允许写入帧缓存再继续判断是否允许深度写入。因此深度测试的目的其实在于是否要舍弃当前片元。
  • 深度写入ZWrite:如果管线设置了允许深度写入,则将刚通过测试的片元的深度值更新到深度缓存。因此深度写入的目的在于更新了一个深度阈值。之后进行深度测试时,不符合新阈值条件的片元都会被舍弃。
纹理映射


  • UV坐标:表示纹理的坐标,不管图片纹理多大,UV坐标永远从0到1,如果(0,0)是纹理的左下角,那么(1,1)就是纹理的右上角坐标。纹理的本质是颜色的二维数组,当我们需要UV坐标(0,0)处的值时,就访问纹理这个二维数组array[0][0]处的值,这就是纹理采样
  • 纹理过小的解决方法:双线性插值, 双向三次插值
  • 纹理过大的解决方法:Mipmap
顶点在渲染管线的变化

对象空间--(模型变换)-->世界空间--(视图变换)-->相机空间--(裁剪矩阵)-->裁剪空间--(视口变化)-->屏幕空间
贴图


  • 环境贴图
  • 法线贴图:记录了高度移动,不改变几何信息,逐像素扰动法线方向,高度 offset 相对变化,从而改变法线方向
  • 位移贴图:改变几何信息,对顶点做位移
  • 环境光遮蔽贴图:计算好的环境光遮蔽贴图,空间换时间
画线算法DDA


  • 原理:利用直线方程y=kx+b,当然要注意k值不存在的时候(竖线或者几乎为竖线),是需要单独处理特殊情况。其它情况的时候,利用两个点坐标计算k值,然后从起点(x小的点)向x大的点遍历,每次x值+1,计算出对应的移植,然后四舍五入计算出两个点中间所经过的像素坐标。但是仅仅这样就能画出正确的线么,不一定,因为当我们考虑k值很大的时候,x+1,y值跨度就非常大,会造成线的不连续,因此,当k>1时,需要考虑让y+1,反求x值。
贝塞尔曲线


  • 递归贝塞尔曲线:在每条直线上 Δt 时间内走到的点的连线
  • 逐段贝塞尔曲线,每四个点控制一段曲线
  • 连续性保证:相邻曲线控制点重合
  • 光滑性保证:重合点的前后切线共线且相等
画三角形算法


  • 扫描线
  • 首先我们将一个任意的三角形分割成两个三角形,分别是平顶三角形和平底三角形
  • 分割多出来的点d将原始三角形分成两部分,D点的坐标很容易计算,将B点y值代入AC直线方程即可求出D点x坐标
  • 从c点开始,每次另y值+1,通过AC直线方程计算对应的插值t(y-yc)/(yd-yc),利用t值带入BC直线方程,然后计算对应y值水平方向BC线段上的点坐标




  • 重心画法
  • 首先计算出三角形最小包围盒,然后遍历包围盒子内的每一个像素坐标点,利用重心坐标判断该点是否在三角形内,如果在则绘制该点颜色到屏幕上,否则就不绘制。




曲面处理


  • 曲面细分
  • loop细分:每个三角形分成四个
  • catmull-clark细分:处理非四边形(奇异点)
  • 曲面简化
  • 处理远距离的几何体
  • 边塌缩,顶点合并(新点到邻面的距离和最小)
Early-Z


  • 将深度测试提前到片元着色器之前的技术
  • 在进入片元着色器之前就可以提前舍弃掉那些被不透明片元遮挡的片元,优化渲染效率。
  • 虽然是在每个模型计算光照之前就进行了深度剔除,但是还是不能完全避免无效光照计算的问题。比如第一个模型渲染的时候,深度通道是没有信息的,这时哪怕这个模型会被后来渲染的模型完全遮挡,它也会计算光照。(Z_prepass解决:首先把整个场景中的模型渲染一遍只更新Z-Buffer 。然后再渲染一遍场景,这次渲染关闭深度写入,每个像素和Z-Buffer中已经存在的深度信息进行对比,只有通过测试的像素才会计算光照。)
  • 物体被全透明的物体挡住,这是不可能的。因此为了避免这种冲突,在使用 Early-Z技术时,不可以使用AlphaTest技术。
延迟渲染和正向渲染

正向渲染延迟渲染
步骤几何处理阶段:获取几何信息,将第二步所需的各种数据存储在多个G-buffer中
光照处理阶段:只需渲染屏幕大小的二维矩形,利用G-buffer的数据对每个光源计算光照
先着色,后进行深度测试
利用几何缓冲区G-buffer将所有模型整合成一个模型再着色
先进行深度测试,后着色
G_Buffer至少会有深度、模板、颜色、法线、世界位置、金属、粗糙、高光这些信息。
复杂度(m个物体,n个光源)O(m*n)O(m+n)
渲染管线顶点生成和处理->图元生成处理->栅格化(片段生成)->片段处理->帧缓冲操作->帧缓冲顶点生成和处理->图元生成和处理->栅格化(片段生成)->几何处理->帧缓冲操作->G-buffer->渲染->帧缓冲器
特点无效渲染太多(early-Z,Z-Prepass优化)
计算量大
支持在场景中使用多个着色模型
适合渲染半透明物体
支持大量的实时光照
只渲染可见的像素,不会有无效的计算。
带宽的开销大幅增加
对于半透明无能为力,所有半透明的物体都需要等待不透明物体以延迟渲染完成之后,在用前向渲染的方式渲染半透明物体。
内存开销大,读写G-buffers的内存带宽用量是性能瓶颈
对多重采样抗锯齿(MSAA)处理的支持不友好。
//正向渲染
for each light :
    for each object affected by the light:
        framebuffer += object*light;

//延迟渲染
for each object:
    render to multiple targets
for each light:
    apply light as a 2D postprocess
光线追踪


  • 光线追踪方法主要思想是从视点向成像平面上的像素发射光线,找到与该光线相交的最近物体的交点
  • 如果该点处的表面是散射面,则计算光源直接照射该点产生的颜色;如果该点处表面是镜面或折射面,则继续向反射或折射方向跟踪另一条光线
  • 如此递归下去,直到光线逃逸出场景或达到设定的最大递归深度
路径追踪


  • 从视点发射一条光线,光线和物体表面相交
  • 根据表面材质属性继续采样一个方向,发出另一条光线
  • 迭代上述两步,直到光线打在光源上或者溢出场景
  • 通过蒙特卡洛方法,计算其贡献,作为像素的颜色值
点在三角形内


  • 面积法,点划分的三个小三角形面积是否等于大三角形;
  • 叉乘法,沿逆时针方向,三角形两两顶点构成三个向量,比如AB,BC,CA,分别用这三个向量与起点和P的交点构成的向量求叉乘,如ABxAP, BCxBP, CAxCP,由右手定则,如果三个结果都是正的,说明这个点都在向量的左边;可以推导得出这个点在三角形内,否则只要有一个是负数,就说明在右手边,在三角形外了。
光线和三角面求交


  • 先判断光线是否和三角形所在的面相交,再判断这个交点是否在三角形内,判断点是否在三角形内;
  • 三角形两条边叉乘求三角形的法向量N
  • N点乘光的方向向量(如果接近0,认为平行)
  • 联立(p-v1)·N=0  p = O+tR,得出 t,p(t<0认为表面在光源背面,无交点)
  • 三条边和交点作叉乘均>0在三角形内部
  • 用Moller Trumbore算法,简称MT算法。(光线的方程是:ray = origin + direction * t) 原理是如果一个点在三角形内,就能用重心坐标系去表示这个点;重心坐标公式,α = 1 – β - λ;带入方程,有3个未知数(β,λ,t),由因为都是三维变量,可以得到三个等式;利用克拉默法则,线性代数的知识,就可以求解出这三个未知数;解出来,判定t是否合理,t > 0,然后α、β和λ三个系数都是非负的,就是有解,在三角形内。
如何判断两个三角形是否相交

如果两个三角形相交,必定至少其中一个三角形的一条边穿过了另一个三角形的内部;把边当作光线去跟另一个三角形求交,如果三条边只要有一条边跟三角形有交点,即可判断两三角形相交,当然关键是要判断计算出来的t是否合理,是否位于边长范围之内。
空间数据结构加速

加速网格


  • 求包围盒;构建网格;将对象存储在重叠的单元格;以光移动方向进入网格;判断重叠的网格体的是否和光相交
空间划分:


  • 四叉树/八叉树
  • 原理:将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割
  • 用途:进行区域较大的划分,然后可以对各种检测算法进行分区域的剪枝/过滤。大规模的广阔室外场景管理;碰撞检测;光线追踪过滤
  • BSP tree
  • 3D空间下,每个节点表示一个平面,其代表的平面将当前空间划分为前向和背向两个子空间,分别对应左儿子和右儿子。
  • 应用:自动生成室内portal,自动生成导航网格,构造CSG几何体
  • KD Tree(轴对齐的BSP树)
物体划分


  • 层次包围盒树BVH
  • 原理:

    • 计算出包围所有三角边顶点的最小包围盒,作为根节点
    • 以包围盒中心为坐标系原点,其坐标系X轴划分出在该X轴左右的三角形,并将这些分别放入左子节点、右子节点中
    • 重复步骤1、2,最后得到一棵BVH树

  • 应用:

    • 碰撞检测,快速过滤大量不可能发生碰撞的图形
    • 射线检测/挑选几何体,从层次包围盒树自顶向下检测是否射线通过包围盒,若不通过则无需检测其子包围盒。
    • 视锥剔除,如果一个节点所代表的包围盒不在视锥范围内,那么其所有子节点所代表的包围盒都不会在视锥范围内,则可以跳过测试其子节点。
    • 光线追踪(Ray Tracing)过滤,光线测试也可以过滤掉大量不必要的碰撞物体,效率一般比基于空间的划分还要好上一些
    • 辅助BSP树构建

  • SAH优化
    对切分的空间计算时间;     
    也就是对比两种切分方法耗时; 式子都同时+t_trav就可以去掉;
    time = S_1面积 /S_0面积 *S_1空间物体数 * t_obj    + S_2面积 /S_0面积 *S_2空间物体数 * t_obj
    t_obj 直接设置为1  ,谁time最小用那种
  • 伪代码
F(传入空间S0, 这空间的物体,层数)
    空间s0面积;
    求S0空间最大轴
    假设这轴为x  调用x排序空间的物体; 假设obj4 , ob2, ob3; 三个物体  (如果0个,1个或2个写个if另一套算法)
        //两种划分方法: 1.前一个为一组 后两为一组
        //              2.前两为一组 后一个为一组
    分类分两种   以重心划分 数组形式 {1,2}
    创建一个运算时间float数组;
    For ( 数组{1,2}赋值给i )
        以i划分空间 生成两个box  s1 s2
        算s1 s2面积
        运算时间数组.push_back  =  S1面积/s0面积 *物体数*1 + s2面积/s0面积*物体数*1 // SAH优化
    运算时间float数组求值最小的那位为最优;

    以最优划分空间 生成两个box  s1 s2

    判断s1 里面几个物体 >1则
        左指针 = F(s1,物体,层数+1)
    判断s2 里面几个物体 >1则
        右指针 = F(s2,物体,层数+1)

    否则
        s0面积
        左右指针
        空间物体对象容器写入
        返回本空间S0的地址 作者:冰月旋律 https://www.bilibili.com/read/cv12225093 出处:bilibili
数据结构适用情形n的数量级构造所需时间是否可以动态更新占用空间
四叉树场景管理(基于地形或不含高度)、渲染物体数量O(n*logn)大(取决于区域大小和物体数量)
八叉树场景管理、渲染物体数量O(n*logn)大(取决于区域大小和物体数量)
BVH树任何情形(包括物理、渲染)物体数量O(n*logn)中(取决于物体数量)
BSP树编辑器、复杂室内场景平面数量O(n*logn)大(取决于平面数量)
k-d树-物体数量O(knlogn)中(取决于物体数量)
mipmap


  • 定义:在渲染时,根据一个像素离眼睛为之的距离,来判断从一个合适的图层中取出texel颜色赋值给像素
  • 优点:会优化显存带宽,用来减少渲染,因为可以根据实际情况,会选择适合的贴图来渲染,距离摄像机越远,显示的贴图像素越低,反之,像素越高。
  • 缺点:会占用内存,因为mipmap会根据摄像机远近不同而生成对应的八个贴图
LOD多层级细节


  • LOD会根据模型距离摄影机的距离,选择不同精度的模型,摄影机越近则选择高精度的模型,远则反之。
  • 优点:提高渲染效率,优化了性能。 缺点:增加了内存占用。
SM(Shadow Mapping)

Shadow Map 原理和改进

  • 在灯光空间下创建一张深度纹理贴图,用于保存物体在灯光空间下的深度信息,此深度贴图则是摄像机的渲染目标。灯管空间下的物体深度信息将被保留在该深度贴图中。    渲染深度贴图的过程比较简单,首先在该视口下的顶点信息进行判断,如果某个顶点的深度值比深度贴图中的值小,就更新贴图数据,反之丢弃掉该数据,直到遍历一遍所有像素点为止。遍历完成后,便得到了深度信息图。    获取到深度贴图后,如果某个点在光源视角下的深度值大于深度贴图中对应位置的深度值,就说明它被某个物体遮挡,因此是在阴影中的;反之,深度值小于深度贴图中的值,则不在阴影之中。    判断完成该顶点是否需要接收阴影后,需要做的最后一步就是对该顶点乘上阴影的颜色,遍历完一遍该物体的所有顶点后,便可得到该物体接收阴影的效果。





  • 常见问题:
    a. 阴影抖动问题,可以通过偏移技术来解决,增加一个bias来比较片段深度,还有更好的一种方式是使用一种自适应偏移的方案,基于斜率去计算当前深度要加的偏移;
    b. 阴影锯齿问题,可以使用百分比渐进过滤(Percentage Closer Filter,PCF)技术进行解决:从深度贴图中多次采样,每次采样坐标都稍有些不同,比如上下左右各取9个点进行采样(即一个九宫格),最后加权平均处理,就可以得到柔和的阴影。标准PCF算法采样点的位置比较规则,最后呈现的阴影还是会看出一块一块的Pattern(图块),可以采用一些随机的样本位置,比如Poisson Disk来改善PCF的效果
PCSS百分比渐近软阴影

通过控制PCF的Kernel Size,就可以改变阴影的模糊半径,进而模拟出软阴影的效果,这就是PCSS算法的思路。之所以有软阴影,是因为某些区域处于光源的半影区(Penumbra),所以PCSS算法会设法估算出当前位置的半影区大小,这个大小决定了PCF算法的Kernel Size,最终呈现出一个视觉上的软阴影效果。
通过计算每个像素周围的点来做加权平均
CSM 级联阴影贴图


  • CSM  根据 对象 到 观察者 的距离提供 不同分辨率 的 深度纹理,为不同距离的物体绘制不同精细程度的阴影贴图。
轮廓描边


  • 基于视点方向的描边
  • 视点方向和法相方向垂直的地方认为是轮廓(点乘接近0的地方
  • 基于过程几何方法的描边
  • 先渲染正向表面,再渲染背向表面,从而使轮廓边缘可见
  • 渲染背面的边界线,使用偏置技术让这条线恰好位于正表面之前
  • 基于图像处理的描边
  • 寻找z缓冲区不连续的地方
  • 基于轮廓边缘检测的描边
  • 检测朝向相反的相邻三角形的交接处绘制

半透明渲染


  • 深度阈值应当是深度最靠近相机的不透明物对应的片元的深度值,否则就会出现透明物体就会挡住不透明物的错误。所以为了防止不透明物体挡住其他图元的情况,在半透明物体渲染时,需要关闭深度写入。但要保留深度测试。
  • 半透明物体的绘制需要遵循画家算法由远及近进行绘制,严格地规定先后顺序,才能正常地做混合操作
  • 半透明物体的相互交叠问题:

    • 开启深度写入,但不输出颜色,目的是计算出模型的深度值,写入深度缓冲。
    • 做正常的渲染着色以及透明度混合。

渲染顺序


  • 先渲染不透明物 :对于不透明物,渲染顺序并不影响其渲染结果,因此谁先谁后无所谓。当然为了优化效率,不透明物里是按照从近往远绘制。
  • 再渲染全透明物 :对于全透明物,unity使用透明度测试(AlphaTest)进行优化,当片元的透明度小于设置的阈值时,就当作全透明处理,否则就当作不透明处理。
  • 最后渲染半透明物 :由远及近严格顺序绘制。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-26 09:52 , Processed in 0.067840 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表