Shader:两个简单效果随记

简单记录一下最近碰到的两个简单 Shader 的实现。
单篇篇幅太短,遂两篇合并成一篇文章。

手柄穿墙破洞

该效果常见于 XR 厂商的防护中心软件(或称安全区、游玩区域等),主要特点:

  • 默认情况下,显示技美的动态墙面特效(水波纹、呼吸云云)
  • 当手柄/手/头等靠近墙面时,墙面会开一个洞,并辅以红色警告提示
  • 离墙距离近,洞开的越大

之前有个朋友问过,当时用 ShaderGraph 拼了个简化示例给他,以下是效果图(GIF):

原理很简单,逻辑帧通过Shader.SetGlobalXXX更新全局 Pose,片元根据距离(的平方)进行着色或者 Clip。

 Shader.SetGlobalVector(LeftHandPosition,Pose.LeftHand);

高斯模糊

每个片元沿周围多次取样,并通过正态分布的比例混合。

多次迭代,可以获取越来越模糊的图像,但带宽和性能消耗也越来越大。

以下是利用常见的 3×3 混合数值,对不不透明队列渲染结果采样,并迭代一次的效果:

悬而未决

虽然原理很简单,但有一个问题不容易解决:那就是与半透明队列物体发生穿插时的模糊。

对于 2D 屏幕特效、全屏特效来说,直接采样最终渲染的结果就行,不用考虑深度。

如果是 3D 空间中的面片,用户可以四处走动,360 度观察它,那上述问题就不能忽视。

DirectX 倒是有对 OIT(order-independent transparency)的原生支持,但如果考虑 Android OpenGLES 等平台的兼容性及性能,以及使用难度,那这玩意几乎不可用。

所以,还是要尽量避免半透明重叠的情况发生。

相关文章

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/10357.html
欢迎加入梓喵出没博客交流群:313732000

发表评论

*

*