抓手

项目组需要一个类似如下的半透明剪影效果,不过我们是3D模型,那么就需要一些特殊的做法。

最终通过使用Stencil Buffer解决了。

详解

一、刚开始的的自以为是

刚做这个需求之前,以为很容易做,不就是在frag shader里return一个半透明的黑色颜色值吗?

然后Tags改成透明

Tags { "RenderType"="Transparent" "Queue" = "Transparent" }

混合模式为

Blend SrcAlpha OneMinusSrcAlpha

Zwrite Off

不就完了吗?

结果说明我真是想得太简单。得到了如下结果:

衣服和身体,重叠了,因为 Blend SrcAlpha OneMinusSrcAlpha的混合计算方式如下:

最终颜色 = shader计算的颜色值*alpha值+(1-alpha值)*屏幕现有颜色值

那么模型身体的像素点渲染过后,覆盖在身体前的衣服再渲染一遍,混合的颜色就成上面那样了。

那这个方案不可行,不是一个严格的剪影。

二、具体的实现办法

有两个办法可以解决上面的问题,

1是使用深度写入:

        Zwrite OnZTest Lessoffset -10000000, 0

offset r,m 的r值越小,就只渲染离摄像机越近的像素。

但是这样会导致它会渲染在所有物体之前,会穿UI。这个方案有瑕疵。

2是使用Stencil Buffer

        Stencil{Ref 0Comp EqualPass Invert}

这里的Ref值是0,如果buffer里的值也是0的话,就通过stencil test,如果通过stencil test和depth test,

这里写入的模版值是用的Invert状态,也就是255,并渲染该像素。

然后下个像素判断当前buffer值不是0的话,则不通过stencil test,则不会渲染。这样就会得到正确的剪影效果。

这个方案比较完美,既不会渲染到最前面,而且还整得跟纸片一样。

全部的代码如下(以下代码只能在URP管线下使用):

Shader "Custom/CharacterShadow"
{
Properties
{        _Color ("主颜色", Color) = (0,0,0,0.6)
}
SubShader
{Tags { "RenderType"="Transparent" "Queue" = "Transparent+100" }LOD 200Pass{Blend SrcAlpha OneMinusSrcAlphaZwrite Off//ZTest Less//offset -10000000, 0Stencil{Ref 0Comp EqualPass Invert}Tags{"LightMode" = "UniversalForward"}HLSLPROGRAM    #pragma vertex LitPassVertex#pragma fragment LitPassFragment#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attributes{float4 positionOS : POSITION;};struct Varyings{float4 pos : SV_POSITION;};CBUFFER_START(UnityPerMaterial)half4 _Color;CBUFFER_ENDVaryings LitPassVertex (Attributes v){Varyings o;VertexPositionInputs vertexInput = GetVertexPositionInputs(v.positionOS.xyz);o.pos = vertexInput.positionCS;return o;}half4 LitPassFragment (Varyings i) : SV_Target{return _Color;}ENDHLSL}
}
}

最终的效果,完美!

Unity 3D模型做半透明剪影效果相关推荐

  1. Unity 3D模型展示框架篇之项目整理

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 1. ...

  2. Unity 3D模型展示框架篇之自由观察(Cinemachine)

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...

  3. Unity 3D模型展示之webGL平台展现

    在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...

  4. Unity 3D模型展示框架篇之ILRuntime快速入门

    系列文章目录 Unity 3D模型展示框架篇之项目整理 Unity 3D模型展示框架篇之框架运用 Unity 3D模型展示框架篇之自由观察(Cinemachine) Unity 3D模型展示框架篇之资 ...

  5. Unity 3D模型展示框架篇之框架运用

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 效果 ...

  6. [独立游戏]用3D模型做2D动画,像素风也可以独当一面

    像素风 对于 玩家来说 是别具一格,可以接受的. 好游戏,并不意味着必须 要多高的模型,多好的写实的 场景. 用简陋的3D模型,可以减少成本.再渲染成2D动画,像素风格.反而 无心插柳柳成荫,成就了 ...

  7. Unity 3D模型动画导出为帧序列

    问题:将用于Unity的3D模型改成2D图片. 思路:把3D动画播放一遍,逐帧对模型截图. 代码说明: 1.要引用的命名空间 using System.IO; using UnityEngine; u ...

  8. unity 3D模型展示旋转缩放

    目标: 在UI层上 自由观察3D 模型,实现鼠标控制模型的旋转,缩放&& 触摸屏手势控制模型的旋转缩放控制: 这里仅将控制代码挂载到相机上,通过对相机的控制来观察模型. 基本上为最小单 ...

  9. Unity 3D模型展示之UI布局

    整体布局情况 导入UI资源并统一将Texture Type设置为Sprite(2D and UI) 1.标题 将Text中的文本设置为'Unity 3D物体展示实例'. 添加Shadow与Outlin ...

最新文章

  1. Algs4-1.4.7统计算术运算与比较次数
  2. 从源码全面剖析 React 组件更新机制
  3. 2018第九届蓝桥杯C/C++ B国赛 —— 第三题:格雷码
  4. java创建单线程计时器_我们如何在Java中实现计时器线程?
  5. win10环境下VTK7.1的编译和Qt调用VTK的详细教程二(VS2013编译支持Qt的VTK库)
  6. 解决:An HTTP error occurred when trying to retrieve this URL.
  7. 经典:趣解什么叫网关?
  8. Elasticsearch2.4.X 搜索引擎框架 安装配置
  9. Squid 配置文件详解
  10. Python和Matlab系统比较
  11. python源码剖析, 第0部分 -- 编译python
  12. adb刷入第三方recovery_PE Plus类原生系统刷入教程(小白基础篇)
  13. 标注工具 labelImg 的下载安装及使用
  14. 裴礼文3.2.34解答
  15. 杭州的互联网公司总结
  16. 北京市市级行政区域数据
  17. ACM学习历程—HDU 5025 Saving Tang Monk(广州赛区网赛)(bfs)
  18. 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出
  19. cocos shader 之 黑白滤镜
  20. #一首国庆生活写照#

热门文章

  1. EXCEL不够用,VBA和Python又太难?那么试试这个工具吧
  2. 多vlan局域网下网络打印机驱动安装
  3. Ubuntu安装boost库
  4. android大作业快递代拿软件,安卓大作业——校内快递代取app的一些总结
  5. 硬盘s.m.a.r.t.信息中关键字对应含义
  6. ios 贝塞尔曲线 颜色填充_iOS UIBezierPath贝赛尔曲线详解
  7. echarts数据可视化系列:中国地图绘制
  8. 简单的手机记事本怎么把英文翻译成中文?
  9. C语言整形数据的负数是如何存储的?
  10. 每秒高达千万分发,如何应对直播互动平台中海量消息挑战?