Unity - Shader - Projector 高空云层底下透明阴影 - semitransparent shadow

本文主要是介绍Unity - Shader - Projector 高空云层底下透明阴影 - semitransparent shadow,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 环境
  • 1 - Semitransparent Shadow - Alpha Test + SoftShadow
  • 2 - Projector - Fake Semitransparent Shadow
  • 3 - shadow map + projector(解決projector投影穿透的问题,后续我再实现)
  • Project
  • References


环境

unity : 2020.3.37f1
pipeline : BRP


1 - Semitransparent Shadow - Alpha Test + SoftShadow

这种方式我最早是在 cat like coding 博主的文章看到的,这种方式我自己亲自测试过
缺点:会有阴影抖动严重的现象

(其中的 dithering tex 可以参考我之前写的:Unity - 手动创建 dithering tex 3d)

如下GIF
请添加图片描述

就算我故意将 精度拉低(将距离边缘,那么 shadow map 的应用精度就会低一些)

50 shadow distance
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

然后抖动的闪烁一样要不得
请添加图片描述


2 - Projector - Fake Semitransparent Shadow

这种方式

  • 缺点:投影穿透,可以参考我之前写的:Unity - Projector - 实时[假]阴影
  • 优点:可以精准控制像素颜色,alpha,还可以只绘制和 projector box 有碰撞的 mesh(shadow map 的方式会绘制整个灯管角度的 PV 部分的所有 mesh)

自己PS整一个云的剪影图,放到 projector 材质贴图即可
请添加图片描述

还可以修改颜色
在这里插入图片描述

穿透的缺点如下GIF
(就算我使用 表面法线 和 Projector 投影反向 来 dot 判断过滤,一样治标不治本,比如,两个 Cube,一上一下,projector 投影后,就算 clip(dot(N, -ProjectDir))后,两个 Cube 的顶部都同样出现投影,所以需要看你的项目实际情况是否适合)
请添加图片描述


我看到有小伙伴说到贴花,并且说,不会有背面效果,我的文章我有写解决方案的,只不过这种方案还是治标不本的,就算是 URP Decal Projector 也同样如此
在这里插入图片描述

那么我尝试回到这位小伙伴的三个为题:

  • 可以用贴花
  • URP Decal Projector 不会有背面
  • projector 性能不好吧
  1. 可以用贴花

首先我们要理解贴花的原理
就是在某个 project 投影视角下,给在内的网格重新绘制一个与 project 投影器有交集的部分
至于重新绘制有多重方法:
1. 整个网格重绘,将 projector下的屏幕坐标作为UV去采样贴花贴图就完事了,于 projector volume没有交集的部分 mask 掉
2. 甚至可以 rebuild 一个 和 project 投影器有交集的子网格,但是有点费CPU
3. 可以使用 depth buffer, normal buffer 来还原 world position 和 world normal,来控制需要重绘的像素 和 剔除背面
4. 更多的方式可以参看 puppet_mater 大佬的: Unity Shader-Decal贴花(SelfDecal,Alpha Blend,Mesh Decal,Projector,Deferred Decal)

第1种比较简单,易于实现,但是比较费
第2种费CPU,一般不使用,但是对 FS 最友好
第3种,有点 defferd 思想,但是再 forward 也可以拿到这两个 buffer,在比较轻松(低成本,低费)可以拿到这两个 buffer 的话,这种方式的效率是最高的,比如:URP 管线;这种方式也有一个问题:透明对象的没法处理(因为没写深度和normal)

而我使用的是 BRP 管线的 unity 使用的是 第1种

另外说一下,我之前在 2021 使用 URP 管线的时候,Decal 组件直接就叫:URP Decal Projector
在这里插入图片描述

  1. URP Decal Project 不会有背面
    在这里插入图片描述

如上图,我的文章我有提到优化方案的,可能我没有将示例放上来,不便于阅读到,抱歉
那么下面我将示例搬上来瞧瞧
请添加图片描述

注意我之前说的:治标不治本在这里插入图片描述
为了直观理解,我给上示例
请添加图片描述

  1. projector 性能不好吧

这个看具体我们是再什么管线使用什么方式来实现
我现在这里使用的是 BRP 的 projector 算是最简单的一种,也算是比较费的一种,费在哪,费在 DC, SetPassCall,和看不到的 顶点仍然执行了 VS 和 MASK 掉,却在同屏的 FS(没有被 ztest 和 stencil 剔除的Frag)

如果在 URP 下 Decal 性能会好一些


3 - shadow map + projector(解決projector投影穿透的问题,后续我再实现)

今天:2022/11/26 - 16:00 左右,突然想到,可以使用 shadow map + projector 方式来做处理比较完美的 半透明 阴影
原理就是:

  • projector 视角生成 shadow map
  • projector 的投影 shader 可以自己采样 shadow map 做是否在阴影的判断,不在阴影的,才处理 projector 叠加绘制
  • (后续我再实现,现在木有空,-_-~)

总结如果视角比较偏某个角度,利用灯光角度于 projector 同步,选用 projector
alpha test + software 的闪烁我是怎么也接受不了

(期待后续了解有其他的方式来制作,已经在 2022/11/26 - 16:00 左右 想到第3中方式,后续再实现)


Project

  • U3D_2020.3.37f1_BRP_TestingSemitransparentShadow_AlphaTest
  • U3D_2020.3.37f1_ShadowProjector_实现高空云层投影
  • U3D_2020.3.37f1_ShadowProjector_with_CullingBackface_实现高空云层投影

References

  • Unity中的半透明阴影
  • Rendering 12 Semitransparent Shadows

这篇关于Unity - Shader - Projector 高空云层底下透明阴影 - semitransparent shadow的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322267

相关文章

UE5 半透明阴影 快速解决方案

Step 1: 打开该选项 Step 2: 将半透明材质给到模型后,设置光照的Shadow Resolution Scale,越大,阴影的效果越好

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

AF透明模式/虚拟网线模式组网部署

透明模式组网 实验拓扑  防火墙基本配置 接口配置 eth1  eth3   放通策略  1. 内网用户上班时间(9:00-17:00)不允许看视频、玩游戏及网上购物,其余时 间访问互联网不受限制;(20 分) 应用控制策略   2. 互联网用户只允许访问内网两台服务器的 WEB、SSH 和远程桌面服务,其余 服务均不允许访问;(20 分) 外网访问内网的限制策略   虚拟网线模式组网 实

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

Google Earth Engine——高程数据入门和山体阴影和坡度的使用

目录 山体阴影和坡度 对图像应用计算 应用空间减速器 高程数据 通过从“重置”按钮下拉菜单中选择“清除脚本”来清除脚本。搜索“elevation”并单击 SRTM Digital Elevation Data 30m 结果以显示数据集描述。单击导入,将变量移动到脚本顶部的导入部分。将默认变量名称“image”重命名为“srtm”。使用脚本将图像对象添加到地图: Map

Unity Adressables 使用说明(六)加载(Load) Addressable Assets

【概述】Load Addressable Assets Addressables类提供了加载 Addressable assets 的方法。你可以一次加载一个资源或批量加载资源。为了识别要加载的资源,你需要向加载方法传递一个键或键列表。键可以是以下对象之一: Address:包含你分配给资源的地址的字符串。Label:包含分配给一个或多个资源的标签的字符串。AssetReference Obj