一些 Shader 的练习,有个哥们把 Unity3D build-in Shader 放到了自己的 Github 里面,并且按照版本打了 Tag,目前只到 2019,不知道断更是因为官方没有更新还是其他原因,不过用来查询内置的函数是真滴方便~ 链接。项目下载之后,可以将显示改成 16:9,不然 free aspect 有可能会看到显示之外的东西。
https://www.jianshu.com/p/c31134f31325
https://www.jianshu.com/p/cbaa9a1780e6
https://www.jianshu.com/p/2bab777adf89
https://www.jianshu.com/p/4f25ab79709b
https://www.jianshu.com/p/c92a979f4a9e
step by step
是一种后处理效果,明度校正:

饱和度校正:

对比度校正:

也是通过后处理,先看美女原图(我承认有一部分私心在里面):

带背景的:

不带背景的:

Prewitt 算子就是把 Sobel 里面的所有 2 都改成 1,效果上区别不是很大。edge 也可以用平方和开根来计算,但这样性能不友好,所以使用绝对值相加也可。
还是后处理,先简单搭一个场景:

使用 Frame Debugger 来查看深度和法线,不过首先你需要把相机的 depthTextureMode 给设置好,如果深度图示全黑或者全白,那么有两种方法:1、Frame Debugger 的 Levels 右边往左调整。2、将相机的 Near Plane 和 Far Plane 调整到正好包住场景。


也可以使用代码来查看:


记录一下这个函数,DecodeFloatRG 用来在 tex2D 之后获取 depth;DecodeViewNormalStereo 用来在 tex2D 后获取 normal。
inline void DecodeDepthNormal( float4 enc, out float depth, out float3 normal )
{
depth = DecodeFloatRG (enc.zw);
normal = DecodeViewNormalStereo (enc);
}
用之前的方法进行边缘检测其实只是在图像上做处理,会出现一些问题,比如说阴影,法线贴图都会被检测到,如图所示:

所以这次我们使用 Roberts 算子和深度法线纹理来进行边缘检测,依旧是一种后处理技术。我做了一点改动,比如说将乘法改成了加法,效果会更明显一点。因为左上角到右下角算出有一条边界,但右上角到左下角边界不明显,如果乘的话,结果就是边界不明显,但实际上只要有一个方向有很明显的边界应该就算做有边界才对,乘法的效果如下(除了这张其他都是加法的效果):

可以选择 只 用深度纹理来检测,但是内部的(包括两个紧连着的物体,比如说墙缝)边界是检测不出来的,因为对于内部边界上的某个像素来说,它的相邻的像素的深度值跟它差距都不大。

还有某些倾斜角度会过多的检测边界:

而 只 使用法线贴图则不会出现这种情况:

你可以像我一样把两种情况结合起来使用,也就是取了并集,也可以自行尝试,最后的效果图:

先还原出现在某一个像素点在世界坐标的位置上,然后计算出该位置上一帧的 NDC 位置,计算出 UV 偏移。
缺点:是根据相机来的,物体动,相机不动,是不会有效果的;重构世界坐标消耗很大。

使用了一种更高效的还原世界坐标的方式,正交与透视需要分开来处理,这里是只有透视的。

使用这个脚本,可以将环境渲染到正方体贴图上,然后根据入射角等于反射角的原理算出反射的方向,再在这个正方体贴图上采样即可。
来源:https://forum.unity.com/threads/what-does-the-function-computescreenpos-in-unitycg-cginc-do.294470/ #24

主要由三部分构成:
- 自身贴图
- 反射,需要一个环境立方体贴图
- 折射,比较巧妙... 只要取除了此物体之外的渲染图(所有 Queue 要设置成 Transparent,不然不能保证它在所有图像后面渲染),在上面找到每个点对应的像素,然后根据切线空间下的法线进行扰动。











