考察专题

实际复杂问题:

1.GUI Instancing移动平台合批:graphics->Instancing Variants 选为keep all。


官方文档指出stripUnused选项会在build(这个build应该指的是打包,不知道为何打Bundle包时候也会受此影响)时保留至少有一个材质(勾选了enable instancing的)关联的Instancing shader,而没有一个关联的Instancing shader 将被移除, 修该该设置过后,一定要重新删掉相应的AB包重打才能起效,可能跟AB包采用增量更新有关。

2.shadow近处用 shadow Projection的 CloseFit,远处Stable Fit。

它对于影子的质量影响很大(官方说明:平行光投射阴影有2种方式:Close Fit渲染较高分辨率的阴影,但是如果相机移动时,有时阴影会轻微摆动。Stable Fit渲染的阴影分辨率较低,不过相机移动时不会发生摆动。)这样改善锯齿。最近在研究BlackSmith的阴影,用于人物。

工作自己实现的效果:

1.描边
描边使用两个Pass,第一个pass沿法线挤出一点,只输出描边的颜色。//在vertex阶段,每个顶点按照法线的方向偏移一部分,不过这种会造成近大远小的透视问题。第二个Pass是正常着色的Pass。描边的对象菱角最好不要多,因为描边是通过法线拓开面的方式做的,所以面会往法线上移,所以菱角多可能会出现有些地方空了。
其实边缘光效果与描边效果有些类似,适当调整边缘光效果,其实也可以达到凸显要表达的对象的意思。边缘光的实现最为简单,只是在计 算的时候增加了一次计算法线方向与视线方向的夹角计算,用1减去结果作为系数乘以一个边缘光颜色就达到了边缘光的效果,是性能最好的一种方法
所谓RimLight边缘发光,也就是说对应我们当前视角方向,物体上位于边缘的地方额外加一个光的效果。那么,怎么判断一个点是否在物体的边缘呢?就是通过法线方向和视线方向的夹角来判断。当视线方向V与法线方向N垂直时,这个法线对应的面就与视线方向平行,说明当前这个点对于当前视角来说,就处在边缘;而视线方向与法线方向一致时,这个法线对应的面就垂直于视线方向,说明当前是直视这个面。所以,我们就可以根据dot(N,V)来获得视线方向与法线方向的余弦值,通过这个值来区分该像素是否处在边缘,进而判断是否需要增加以及增加边缘光的强弱。


在第一个Pass中,我们会使用轮廓线颜色渲染整个模型背面的面片,并在视角空间下把模型顶点沿着法线方向向外扩张一段距离,以此来让背部轮廓线可见。
但是如果直接使用顶点法线进行扩展,对于一些内凹的模型,就可能发生背面面片遮挡正面面片的情况。为了尽可能防止出现这样的情况,在扩张背面顶点之前,首先对顶点法线的z分量进行处理,使它们等于一个定值,然后把法线归一化后再对顶点进行扩张。这样的好处在于,扩展后的背面更加扁平化,从而降低了遮挡正面面片的可能性。

2.消融
消融效果常见于游戏中角色死亡、地图烧毁等效果。实现原理概况来说就是噪声纹理+透明度测试。我们使用对噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就使用clip函数把他对应的像素裁减掉,这些部分就对应了图中被“烧毁”的区域。而镂空区域边缘的烧焦效果则是将两种颜色混合,再利用pow函数处理后,与原纹理颜色混合后的结果。
这里使用Cull Off命令关闭了该shader的面片剔除,也就是说模型的正面和背面都会被渲染,这时因为消融会导致裸露模型内部的构造,如果只渲染正面会出现错误的结果。
首先对噪声纹理采样,将采样结果和用于控制消融程度的属性_BurnAmount相减,传递给clip函数。当结果小于0时,该像素将会被剔除,从而不会显示到屏幕上。如果通过了测试,则进行正常的光照计算。先根据漫反射纹理得到材质的反射率albedo,并由此计算得到环境光照,进而得到漫反射光照。然后计算了烧焦颜色burnColor,我们想要在宽度为_LineWidth的范围内模拟一个烧焦的颜色变化,第一步就使用了smoothstep函数来计算混合系数t。当t值为1时,表明该像素模拟一个烧焦效果。我们首先用t来混合两种火焰颜色_BurnFirstColor和_BurnSecondColor,为了让效果更加接近烧焦的痕迹,我们还使用pow函数对结果进行处理。然后再次使用t来混合正常的光照颜色(环境光+漫反射)和烧焦颜色。我们这里又使用了step函数来保证当_BurnAmount为0时,不显示任何消融效果。最后,返回混合后的颜色值finalColor。

3.涟漪
距离系数、时间系数、sin函数结果系数、波纹宽度、波纹扩散速度。
定义一个中间点,计算UV到中间点的向量。按照屏幕长宽进行缩放、计算像素点距中点的距离。用sin函数计算出波形的偏移值factor。dis在这里小于1的,所以需要乘以一个比较大的数,这样就有多个波峰波谷。最后计算uv偏移,采样即可
fixed3 halfVector = normalize(normalize(lightDir)+normalize(viewDir));
float NdotL = saturate( dot(s.Normal,lightDir) );
然后,我们对镜面高光进行修改计算,将顶点法线和各向异性法线贴图上每个像素进行求和,再与halfVector进行点乘运算,最后我们得到一个float值。该值为1,表面物体表面法线和halfVector平行,该值为0,他们是垂直的。
最终的sin函数计算后,我们就得到了中间有亮点且基于halfVector的环形效果。
fixed HdotA = dot(normalize(s.Normal+s.AnisoDirection),halfVector);
float aniso = max(0,sin(radians(HdotA+_AnisoOffset)*180));
最后在对aniso的值进行放大,得出s.Gloss求幂,通过s.Specular降低它的强度。

4.各向异性
各向异性是一种模拟物体沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光。这样,我们就可以开始进行光照运算,采用半角矢量的方法,我们避免了全反射和散射的计算,也就只需要计算顶点发现和光线向量两者的点乘积。

5.换色
通过外传参数,记录参数,并乘以系数,换色区域进行采样。

6.SSS
我们是采样暗部区域,进行颜色和强度的暗部着色。
次表面散射(SSS)的概念自行百度,表现光进入物体,然后发生内部散射,最终从不同的位置射出,主要用于模拟玉石,翡翠,蜡烛,皮肤等有一点点透光的物体。常规的漫反射计算公式为:
float diffuse=max(0,dot(L,N));
然后就是计算物体的半透明度,这里的透明只是模拟颜色的淡化,而非真的透明。物体半透的主要因素是光在物体中穿过的时候会逐渐丢失能量,穿过的物体越厚,越不透明,模拟半透主要问题在于获取光穿过物体距离。有两种计算方式:计算当前视角下场景的深度,然后以光的位置和方向做为摄像机位置和朝向渲染场景,获得光位置处场景的深度图,最后将光位置处深度信息映射到当前视角下,获得当前视角下光穿过物体的厚度;先渲染当前视角的深度信息,然后渲染当前视角背面的深度信息,获得物体当前视角下的厚度(这里面获取深度信息的原理,在另一篇说)。

7.cubemap反射
通过视角方向,法线,得到反射方向,用这个对cubemap进行采样,然后根据一些系数计算。
8.自发光
采样后,时间系数乘自发光速度,frac取小数部分。取绝对值,和最小值0.5进行插值计算,再乘以强度和alpha。

考察基础点:

1.延迟渲染:
延迟渲染主要包含了两个Pass,再第一个pass中,我们不进行任何光照计算,而是仅仅计算哪些片元的可见的,是通过深度缓冲计算实现的,当发现一个片元是可见的,欧美就把它的相关信息存储到G缓冲区中,然后在第二个Pass中,我们利用G缓冲区的各个片元信息,例如表面的法线、视角方向、漫反射系数等,进行真正的光照计算。
但是延迟渲染也有缺点:
不支持真正的抗锯齿功能。
不能处理半透明物体。
对显卡有一定要求。

2.阴影:
如果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值