fragment 淡入淡出_一种模型淡入淡出时透明面重叠问题的解决方案
角色死亡时需要一个渐消效果,最普通的想法就是转成透明物体设置alpha淡化,然后就会出现这样的情况。
由于模型有分层,会露出衣服下面的部分,而那些部分往往是有缺失的,就算只显示1秒也非常出戏。而想解决这个问题也简单,在前面新增一个PASS仅绘制深度,就能过滤掉内部的模型了。这也是魔兽世界等游戏处理潜行和幽灵人物的方法。
Pass
{
Tags{ "RenderType"="Transparent" "Queue"="Transparent" }
ColorMask 0
}
这个方案的是完美的吗?其实并不是。首先这样做会导致模型以透明方式绘制,无法遮挡地面导致overdraw,但这也算小事。问题在于,这种方法只能针对单Renderer物体,有多个Renderer的时候它还是会重叠绘制。如果你希望不重叠,可以将写深度的PASS的RenderQueue向前设置,但这样做的话,所有被这个物体遮挡的透明物体又都无法显示了(我的世界的玻璃就是这样一种状况),想要两全其美比较麻烦。合并模型是能解决问题,但是材质不同怎么合?分部位换装怎么可能只用一张贴图?
更何况,毕竟这是把不透明物体变成了透明物体,这两者在渲染处理上相差巨大,并不总能保证转换自然(透明度设置为1时应该保证和之前不透明时的显示一致)。而到了延迟渲染管线后,由于透明物体机理上难以接受光照,只能单独处理,或者代价巨大,就彻底无法使用了。
所以现世代游戏不少都是用的下面这种做法。
某一帧
实际上并没有任何透明像素,仅仅是通过clip让前方的像素和后方的像素交替显示,做出一种“看上去是半透”的效果。这样实质上还是不透明物体渲染,上面说的那些问题就都不存在了。
以下是Shader
Shader "Unlit/AlphaGrid"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Alpha ("Alpha", Range(0,1)) = 0.1
_AlphaGridTex ("Alpha Grid Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float4 screenUv : TEXCOORD1;
UNITY_FOG_COORDS(1)
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _AlphaGridTex;
//float4 _AlphaGridTex_ST;
float _Alpha;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
float4 screenPos = ComputeScreenPos(o.vertex);
screenPos.xy *= _ScreenParams.xy / 8;//此处不能先除w,会导致插值精度不够
o.screenUv = screenPos;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
float gridAlpha = tex2Dproj(_AlphaGridTex, i.screenUv).a;
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
clip(_Alpha - gridAlpha);
return col;
}
ENDCG
}
}
}
注意_AlphaGridTex应该设成全局纹理,我这样写只是为了不写cs代码。
纹理本身是这样的一张8x8的alpha8图片,记录了每个8x8屏幕像素的过滤顺序。
放大:
本来想用算法生成,最后还是手绘方便……64个点而已。
当然,这样做虽然不用额外PASS,但是毕竟是AlphaTest的做法,比不透明物体渲染还是会慢的,顶点上也多了一些计算压力,但也就仅此而已了。
(目前手游上,非PowerPR芯片使用discard会导致Early-Z失效,AlphaTest的物体即使被其他物体遮挡也会照样绘制,导致浪费OverDraw,但那也是它被遮挡的时候才会发生的情况,这种情况恐怕并不常见,而且即使再差也还是比alphablend强。
而PowerPR芯片则是另外一种情况,虽然不会导致OverDraw浪费,但是绘制本身变慢了,假如人物frag阶段比地面复杂,半透程度也比较高的话,确实会有一定的性能问题。所以这并非优化,而是一种解决问题的办法,至于到底是变快还是变慢还要看具体的情况)
当然,这种方法并不能用来做常态的人物半透,久了是必然糊弄不了的,只能用来做渐入渐消。(虽然有游戏确实在这么搞,诸如FF14,他们也是没其他的选择吧)
效果确实也不能算好,只是特殊情况的特殊选择。
但多个选择总是好的。
涉及到的文件下载
fragment 淡入淡出_一种模型淡入淡出时透明面重叠问题的解决方案相关推荐
- mysql生产cdm文件_几种模型文件(CDM、LDM、PDM、OOM、BPM)
概念数据模型 (CDM): 帮助你分析信息系统的概念结构,识别主要实体.实体的属性及实体之间的联系.概念数据模型(CDM)比逻辑数据模型 (LDM)和物理数据模型(PDM)抽象.CDM 表现数据库的全 ...
- repositoryitemlookupedit根据每行的id绑定数据_一种根据数据库自增ID生成唯一ID的解决方案...
在我们的开发过程中,经常会遇到ID生成的问题,那么这里就介绍一种解决方案,注意这里只适合混淆ID规则,也就是说生成的ID没有任何规则,不适用于订单ID. 一般有序自增主键的ID,极易被爬虫抓取数据,作 ...
- 【Web技术】1424- 4 种在页面关闭时上传监控数据的解决方案
来自:掘金,作者:我是leon 链接:https://juejin.cn/post/7106365076197605413 概览 本文以 "前端监控上报数据" 的业务场景,重点解析 ...
- bim 模型web页面展示_一种操纵BIM模型在网页展示的方法与流程
本发明涉及操纵BIM模型在网页展示的方法. 背景技术: : 现有网页展示BIM模型使用的是同步传输技术,同步传输的比特分组较大,它不是独立地发送每个字符,每个字符都有自己的开始位和停止位,而是把它们组 ...
- 第三天2017/03/30(上午:二级指针的(输入)内存模型:(共三种模型))
二级指针 char a[10][10]; char (*a)[10]; char *a[10]; char **a; char **a; char **a; 字符数组的操作易犯错误: 1.字符数组在使 ...
- 人口预测和阻尼-增长模型_使用分类模型预测利率-第3部分
人口预测和阻尼-增长模型 This is the final article of the series " Predicting Interest Rate with Classifica ...
- 回归模型评估_评估回归模型的方法
回归模型评估 Evaluation metrics; 评估指标: Mean/Median of prediction预测的均值/中位数 Standard Deviation of prediction ...
- 人口预测和阻尼-增长模型_使用分类模型预测利率-第2部分
人口预测和阻尼-增长模型 We are back! This post is a continuation of the series "Predicting Interest Rate w ...
- 零信任模型_关于信任模型
零信任模型 In the world of deep learning, there are certain safety-critical applications where a cold pre ...
- 机器学习模型 非线性模型_调试机器学习模型的终极指南
机器学习模型 非线性模型 You've divided your data into a training, development and test set, with the correct pe ...
最新文章
- swift 用协议实现代理传值功能
- (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程
- 关于__init、__initdata和__exit、__exitdata的学习笔记
- .NET代码编写规范 整理
- Java与.net的区别delegate和event
- 通过javascript在网页端生成zip压缩包并下载
- PREV-55 小计算器 (进制转换)
- 第1章 C/C++与开发环境介绍(《C和C++游戏趣味编程》配套教学视频)
- python课程-Python课程
- python列表使用技巧大全_Python 基础起步 (六) List的实用技巧大全
- 间通过蓝牙模块建立通讯_拥抱蓝牙mesh,幻腾用“互联”深化智能
- Contest1874 - noip基础知识五:动态规划(背包、树dp、记忆化、递推、区间、序列dp、dp优化)...
- 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量
- 移动端 重定向 https 请求
- 掌握Android阅读源码的两种简单方式
- python3下载m3u8转mp4_Python3爬虫通过m3u8文件下载ts视频 Python爬虫
- fgo服务器维护补偿,FGO1月23日服务器故障说明公告 全服补偿24圣晶石
- Word在生成PDF后,PDF左侧导航书签没有目录
- cpu超线程优缺点_超线程对游戏性能会影响?
- 移动硬盘无法退出终极解决方法
热门文章
- 清华教授!亲手教你JavaScript 在线解压 ZIP 文件,实战理论全都有
- javascript 使用zlib发送wss请求,接收blob,并解压
- 长度游程编码的JAVA源代码_游程编码(Run Length Code)
- SDIO接口(3)——SDIO总线接口
- 小爱同学app安卓版_小爱同学app下载-小米小爱同学下载2.9.21安卓版-西西软件下载...
- 小爱同学服务器维修,小爱同学TTS服务(2019年5月29日更新可用版本)
- 数学建模学习笔记:层次分析法
- torch中dataloader加速
- python网络爬虫最细致讲解之漫画抓取【细!!!】
- 并查集算法最全最详细讲解