屏幕后处理效果
屏幕后处理效果是当前场景的主要渲染或者所有的不透明的pass渲染完成后调用后处理脚本对之前的渲染完成的基础之上再调用shader和material做整体的调整
调整屏幕的亮度饱和度和对比度
他用到的主要技术是屏幕后处理效果和调整算法。
在调整算法中他们这三个的调整是分顺序的,先是使用亮度值直接乘当前的颜色值调整亮度,再使用luminance算法去掉颜色只保留亮度后使用饱和度值和第一部的结果做插值。最后使用平均颜色和原图对对比度值做插值得到最后的结果
高斯模糊
使用高斯滤波和屏幕后处理效果
高斯滤波就是分别使用高斯核的一维纵坐标和一维横坐标对图像进行采样,再乘权重值并相加,两次处理之间使用缓存存储结果,并在处理结束后释放缓存
优化:适当降低原材质的大小,降低处理的像素数提高性能,提升模糊效果
增加迭代次数提升模糊效果
多次迭代之间同样用缓存存储每次迭代的结果
bloom
用到的技术:提取亮色的区域,并对亮色的区域做高斯模糊,将亮的区域扩散到其他区域,最后混合两张图像
提取亮度是通过亮度算法去掉颜色保留亮度再通过阈值把不亮的地方设为0,再把亮度区域高斯模糊,最后把两张图像相加
使用深度和法线纹理
运动模糊
边缘检测
利用roberts算子(2*2)计算左上角和右下角的插值,乘以右上角和左下角的插值,然后再进行比较如果超出某个阈值就认为存在一条边。
非真实感渲染
卡通风格渲染
轮廓线
将模型的顶点沿着法线方向延申,再剔除表面得到轮廓线
黑白灰色阶
将兰伯特光照模型中的颜色位于01之间的值进行放大取整再缩放
高光
利用blinephone光照模型中的的高光利用smoothstep中的柔和做到分离
边缘光
使用摄像机方向和法线方向的点乘取反+1检测出边缘光
素描风格渲染
利用6张素描纹理,在顶点着色器中计算顶点光照再使用光照值的强弱混合素描纹理的采样结果
噪声
消融
开启透明度测试
对噪声纹理进行采样,并将采样结果和阈值进行比较,小于0会使用clip函数这个像素会被踢出
越接近0越接近灼烧边缘,在用颜色混合和pow函数加强燃烧的颜色效果
再使用unity自带的阴影处理函数,计算阴影的投射
水波
反射
reflect函数值对cubemap做空间采样
折射
使用grabpass获取屏幕纹理再使用法线对屏幕像素尽心偏移
水波
使用噪声纹理生成水波的法线,并随时间不断平移
混合
使用菲涅尔系数来动态混合反射与折射的效果
全局雾效
屏幕后处理
通过噪声纹理的采样结果得出一个动态的雾效系数,
再根据世界空间中的当前像素对应的高度和材质属性计算雾效系数并和原颜色混合后返回
星夜极光
主要技术光线步进和噪声纹理
光线步进
从一个点出发发出多条射线,射线按照一定的距离进行步进。每一次步进,对符合距离场函数的点进行采样,并将采样结果进行混合 作为最终结果。
噪声纹理
一张纹理图,我们可以对他采样来获取随机值。来模拟现实世界中的不规则的变化。
大致思路
极光
使用世界空间下的原点作为射线的发出点,使用倒数函数作为距离场函数,来模拟大气层表示极光显示的范围。
符合距离场函数的坐标点的坐标作为uv值对噪声纹理进行采样,在采样结果的多次叠加时增加前几次采样的权重形成极光拖尾渐变效果
星空
使用时间宏对uv做扰动并做向上取整向下取整的结果做两次采样,叠加两次效果实现忽明忽暗的效果
PBR(真实感渲染)
基于BRDF理论,unity实现了基于物理的渲染工作流,只需调整standershader中的参数就能实现各种材质
standar shader参数
RenderingMode物体是否是透明或不透明物体
Albedo基础固有色,或者叠加色
Metallic控制物体的金属程度和粗糙程度(是漫反射占主体还是高光反射占主体)
NormalMap、HeightMap法线纹理和高度纹理。法线纹理中能显示出凹凸不平,但在现实中凸出明显的部分是能够遮住其他部分,这一点法线纹理是做不到的。高度纹理弥补这一点。
Occlusion环境光照纹理
Detail Mask蒙版纹理控制显示的区域
Emision自发光属性
实战材质
木制纹路,帆布,石砖路 ,金属装饰物
渲染管线
渲染管线是渲染流程的具体实现。
unity中自定义了一些渲染管线。根据不同的场景选择合适的渲染管线。
最好不要在创建好项目后转换会出现错误,尽量在创建项目时选择合适的渲染管线
高清渲染管线 (HDRP)
将内置渲染管线转换为高清渲染管线
- 使用package manager下载 High Definition RP 并安装
- 打开HDRP Wizard 点击Fix ALL再点击Create One
- 结束后在HDRP Wizard 中点击Convert All Built -in Materials to HDRP将材质替换成hdrp适用的材质
- 添加Volume>>Sky and fog global volume到场景中,window>>Rendering>>Lighting在environment中的profile选择刚才创建的Sky and fog global volume,在下面的static lighting sky中选择PhysicallyBasedSky,之后的平行光会多出很多属性。
通用渲染管线(Universal Render Pipeline)
将内置渲染管线转换为通用渲染管线
- 在package manager 中安装Universal RP
- 在Assets目录下点击Create >>rendering >>URP asset (with universal renderer)
- 点击Editor>>Project Settings>> Graphics>>Scriptable render pipeline settings ,选择刚刚创建好的URPAsset 点击continue
- 打开Window>>Rendering >>Render Pipeline Converter。选择Built-in to URP,选择要转换的asset。之后再initialize and Convert
简单水体(URP初实战)
切换到URP后语言也会升级到HLSL(DirectX)相应的一些函数也会发生变化
获取深度纹理
使用panel做出河床的形状
shader设置透明度混合和混合因子
获取不同位置的深度信息,与颜色做插值显示不同深度水体颜色,使用噪声扰动做出流动效果
魔法球(Shader Graph初实战)
使用菲涅尔效应和噪声纹理二次采样最后使用bloom效果
优化
影响因素
cpu:减少draw call的数目 (批处理)
GPU:减少顶点数(优化模型),减少处理的片元数目(控制绘制的顺序) 减少计算的复杂度(LOD) 减少内存带宽(减少纹理的大小)
渲染分析工具
1渲染统计工具 查看当前帧所绘制的内容
2性能分析工具 查看当前帧所消耗的机器性能
3帧调试器 当前帧的渲染顺序和渲染事件
批处理勾选static中的batching static
shader中log设置合适的值,当lod小于某个值时这个shader才会被启用