Unity HDRP Custom Pass (Post processing) 后处理特效学习(二)总结

本篇详细解析Unity HDRP中CustomPass后处理特效,深入探讨屏幕尺寸、ddx/ddy计算方法及勾边特效实现。文章涵盖设备深度、线性深度、世界法线勾边原理,提供代码示例并分析断线原因。

目录

B站视频

B站视频,录制不易,求关注、一键三连(点赞、投币、收藏)。置顶评论内有PPT(内有优秀参考资源链接)、工程、插件、群号。

官方社区

文字版总结,编写不易,求关注、点赞。手机版阅读困难的,记得是在电脑浏览器中查看 开发者社区

分享背景

突然开始做分享主要2个原因。
  • 有朋友和我说Unity是不是只是手游引擎呀,UE能做的Unity能不能做呀,恰巧看到虚幻官方月神的直播讲后处理,所以就试着也录一期Unity的,证明Unity并不只是手游引擎。
  • 最近被一个Unity官方合作的知名博主up主麦扣的群里的管理员傲娇修酒z侮辱了,发现如果没有粉丝,被人侮辱的时候甚至没有人帮我说话,所以希望吸引一些愿意帮我说话的粉丝。除非麦扣把侮辱人的管理员踢掉,否则这事情永远不会揭过。
另外这可能不是最好的分享,但是绝对是最详细的分享,不会不求甚解的去分享一些一眼就能看明白的东西。

感谢

首先要感谢一下叶月葵(Hazukiaoi),没有他,无法制作这系列视频和分享。

上一期有更新

上一期有更新,补充了很多内容和配图,务必重新阅读一遍。 Unity HDRP Custom Pass (Post processing) 后处理特效学习(一)总结

屏幕尺寸 _ScreenSize

屏幕尺寸_ScreenSize是一个float4,内容分别是(W,H,1/W,1/H)。W和H很好理解,就是屏幕宽高。那么1/W和1/H是什么用途的呢?可以回想上一期视频和分享中提到的PositionInput结构体中的positionNDC跟positionSS,_ScreenSize主要用于这两个坐标之间的转换。
    
    
    
positionNDC = positionSS * _ScreenSize . zw ; positionSS = positionNDC * _ScreenSize . xy ;

ddx/ddy

ddx

返回指定值相对于屏幕空间x坐标的偏导数。

ddy

返回指定值相对于屏幕空间y座标的偏导数。

计算方法

在三角形光栅化过程中,GPU一次运行许多片段着色器的实例,将它们组织成2×2像素的块。dFdx是将块中像素值的差值减去块左侧的像素值和右侧的像素值,dFdy是将底部像素的值减去顶部像素的值。请看下面的图片,其中网格表示渲染的屏幕像素,dFdx、dFdy表达式是为由片段着色器实例在(x、y)屏幕坐标处计算的通用值p提供的,属于2×2块的红色高亮显示的2×2块。导数可以对片段着色器中的每个变量进行计算。 对于向量和矩阵类型,导数是按元素计算的。
值得注意的是图上是以glsl中的dFdx和dFdy进行讲解,实际上Unity中使用的是hlsl中的ddx和ddy,并且是以左下角为坐标原点。其次,既然ddx和ddy是像图中一样,ddx(p(x,y))=p(x+1,y)-p(x,y),ddy(p(x,y))=p(x,y+1)-p(x,y)。对于显卡内部计算这个2x2块,并不知道旁边的2x2块的数据,那么他是怎么计算ddx(p(x+1,y))、ddx(p(x,y+1))、ddx(p(x+1,y+1))、ddy(p(x+1,y))、ddy(p(x,y+1))、ddy(p(x+1,y+1))的呢?
怀着这个疑问,进行了测试与探讨,最终得出结论,2x2块中,4个像素的ddx共享一个值,4个像素的ddy共享一个值。ddx只与p(x,y)、p(x+1,y)有关,ddy只与p(x,y)、p(x,y+1)有关。无论ddx与ddy都与p(x+1,y+1)无关。
可以自行查看工程中的CheckDDX场景进行验证,下面有些截图证明这个结论。
从上面几张图,可以看出,ddx跟左下p(x,y),右下p(x+1,y)有关,跟左上p(x,y+1),右上p(x+1,y+1)无关。看颜色变化,输出的是ddx的值。
从上面几张图,可以看出,ddy跟左下p(x,y),左上p(x,y+1)有关,跟右下p(x+1,y),右上p(x+1,y+1)无关。看颜色变化,输出的是ddy的值。
从上面几张图,可以看出,ddx ddy都跟右上右上p(x+1,y+1)无关。
那为什么一定要搞明白这个ddx和ddy的计算方式呢?那是因为后面介绍的第一种最简单的勾边方式,就是使用ddx、ddy对设备深度、线性深度、世界法线计算来达到勾边的目的。但是你会发现ddx和ddy的方式勾边会有断线的情况,其实这个就是因为这个4个像素共享ddx ddy值导致的,所以如果真的用ddx、ddy进行勾边,一般还会加上一个TAA的抗锯齿。

abs

返回指定值的绝对值。

clamp/saturate

clamp

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值