让粒子可以在白色背景显示 [Blending Shader 实操]
Unity3D 提供了粒子特效的各种shader,今天要说的是 Additive(因为项目最初就是用了Additive 发生了问题.. ε=ε=ε=┏(゜ロ゜;)┛)
Additive Particle Shader 其Blending 方式是 Blend SrcAlpha one。至于Blend 的操作可以看这篇文章 [转] SHADER BLENDING,此处不再详述。
其原理很简单,其实就是在原图的基础上使用加法将颜色进行叠加。[注:Blend SrcAlpha one的方式(Blend 方式具体不详述)]
其Shader 大概如下:
fixed4 frag(PixelInput I):COLOR
{
fixed4 c = tex2D (_MainTex, I.uv_MainTex) * I.color;
return c;
} Pass
{
Blend SrcAlpha one CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
// 下面使用固定渲染管线的写法能达到同样效果
//SetTexture [_MainTex] { combine texture * previous }
}
但是单纯使用 Additive 的话,会导致 在白色的背景上,Particle 会"消失"
问题图:
而 放在暗处便可以看得清楚些(越暗越明显)
理想效果图:
所以要让Particle 在黑白底上都能现实清楚,所以不能单单使用Additive。
具体方法是 作2次Pass,2次Pass 使用不同的Blend 方式
第一次Pass [Blend SrcAlpha OneMinusSrcAlpha]
第二次Pass [Blend SrcAlpha one] // Additive
下面这段存粹是根据视角效果调整的参数,不是唯一的方法。
Blend SrcAlpha one | Blend SrcAlpha OneMinusSrcAlpha |
根据上图我们发觉 单纯使用 SrcAlpha one 会有"过曝光"的感觉(在黑暗部分没问题),而SrcAlpha OneMinusSrcAlpha 的话 给人的感觉是"太实",而且没有发光的感觉。
在SrcAlpha OneMinusSrcAlpha 中导致太实的原因是透明度太低,而针对没有发光的感觉,可以适当地将 整体调"亮"一点。
感觉视觉效果调整的算法如下:
fixed4 c = tex2D (_MainTex, I.uv_MainTex) * I.color;
c.rgb+= 0.2; //变白一点
c.a = min(c.a, 0.3); // 透明一点
return c;
Blend SrcAlpha OneMinusSrcAlpha +调整算法 | Blend SrcAlpha OneMinusSrcAlpha +调整算法 + Blend SrcAlpha one |
哪怕调亮了一点 给人的感觉还是没有光的感觉 这是 Blend 的原因 |
[最终效果] = 左边的效果 再 加 Pass 一次 Blend SrcAlpha one(Additive) |
需要注意的是,每多一个Pass 其实就是多画了一遍。可以检查下 游戏画面的三角形数 明显是相对于单纯的 Additive 是多了1倍的三角形,这就是多个Pass导致的,效果和性能需要平衡一下。
下面是Shader 源码:)
Shader "Custom/MyParticlesAdditive" {
Properties {
_MainTex ("Particle Texture", 2D) = "white" {}
}
SubShader {
Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" }
BindChannels {
Bind "vertex", Vertex
Bind "color", Color
Bind "texcoord", TexCoord
}
ZWrite Off
Cull Off
Fog {
Color (,,,)
} CGINCLUDE
#include "UnityCG.cginc" sampler2D _MainTex;
float4 _MainTex_ST; struct VertexInput {
float4 position:POSITION;
fixed2 coord:TEXCOORD0;
fixed4 color : COLOR;
};
struct PixelInput
{
float4 position:POSITION;
fixed2 uv_MainTex:TEXCOORD;
fixed4 color : COLOR;
}; PixelInput vert(VertexInput I)
{
PixelInput O;
O.position=mul(UNITY_MATRIX_MVP,I.position);
O.uv_MainTex= TRANSFORM_TEX(I.coord,_MainTex);
O.color = I.color; return O;
}
fixed4 frag(PixelInput I):COLOR
{
fixed4 c = tex2D (_MainTex, I.uv_MainTex) * I.color;
return c;
} fixed4 grayscale(PixelInput I): COLOR
{
fixed4 c = tex2D (_MainTex, I.uv_MainTex) * I.color;
c.rgb+= 0.2;
c.a = min(c.a, 0.3);
return c;
}
ENDCG Pass
{
Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM
#pragma vertex vert
#pragma fragment grayscale
ENDCG
} Pass
{
Blend SrcAlpha one
SetTexture [_MainTex] { combine texture * previous }
//CGPROGRAM
//#pragma vertex vert
//#pragma fragment frag
//ENDCG
}
}
}
细心的话,在所谓的最终效果图 中发现还存在一些瑕疵,就是有些地方有黑边,这个问题是 图片的原因 解决方法会在下一篇文章介绍【图片去黑底】
让粒子可以在白色背景显示 [Blending Shader 实操]的更多相关文章
- C#多线程及GDI(Day 23)
又来到了总结知识的时间了,今天又学了一些新的知识,是多线程和GDI的一些运用. 理论: 在学习多线程之前,首先要了解一下什么是进程? 进程:(关键字Process)进程是一个具有一定独立功能的程 ...
- Three.js粒子特效,shader渲染初探(一篇非常详细的介绍)
Three.js粒子特效,shader渲染初探 转载来源:https://juejin.im/post/5b0ace63f265da0db479270a 这大概是个序 关于Three.js,网上有不多 ...
- Cocos2D v3.4.9粒子效果不能显示的原因分析及解决办法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在游戏App中为了衬托气氛我们往往使用一些特殊的图形效果,粒子 ...
- 【淡墨Unity3D Shader计划】四 热带雨林的文章: 排除、深度测试、Alpha测试和基本雾编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云 ...
- Cocos2D粒子发射器的纹理
每个例子发射器只能使用单个纹理发射粒子. 如果你需要在相同粒子效果中组合多重纹理,你将不得不创建多重的发射器节点并且决定谁的粒子将在其它粒子之上或之下显示.
- 关于Unity中GrabPass截屏的使用和Shader的组织优化
GrabPass截屏 可以用来截屏,截屏后把纹理传给下一个通道使用. 1:使用抓屏通道, GrabPass {} 或 GrabPass { “ 纹理名称”}; 使用GrabPass {}后,可以用_G ...
- 关于Unity中顶点片元Shader实例
补充 float4 fixed4 _Time 1: float4是内置向量 (x, y, z, w); float4 a; 访问单独成员a.x, a.y, a.z, a.w;2: fixed4 是内置 ...
- [粒子特效]osg的自带粒子系统osgParticle::ParticleSystem
osgParticle示例简单的演示了在osg中使用粒子系统的效果,用到了osgParticle库中的相关类,在osgParticle中主要有: (以下部分材料摘取自osg向场景中添加osgParti ...
- Create a Basic Shader in Shader Forge
[Create a Basic Shader in Shader Forge] 1.打开ShaderForge.Window-> Shader Forge.(打开速度较慢) 2.通过NewSha ...
随机推荐
- 关于ComboBox的控件事件CBN_SELCHANGE总是取到旧值的问题
我发现复选框,选择以后,在这个事件函数中,总是取到旧值,读了这个朋友的文章,找到了解决方法. 下面是参考的文章: http://scorpiomiracle.iteye.com/blog/710511 ...
- JSFL元件类型判断 转载于 https://blog.csdn.net/linking530/article/details/8364600
//获取舞台上第一层第一帧上的全部元件 var els = fl.getDocumentDOM().getTimeline().layers[0].frames[0].elements; //遍历元件 ...
- 超简单(两步)-微信怎么实现打开外部浏览器,下载app,打开网页URL
现在微信渠道可以说是拉新最快的渠道,因为微信具备强裂变性.但是目前微信对第三方下载链接的拦截是越来越严格了,那么想要在微信内肆无忌惮地推广链接就需要用到微信跳转浏览器的接口,那如何获取该接口呢? ...
- json与csv的基础用与法
json库是处理json格式的python标准库 有两个过程: 编码(encoding):将python数据类型转换为json格式的过程 解码(decoding):从json格式中解析数据得到的pyt ...
- VC使用双缓冲制作绘图控件
最近用VC做了一个画图的控件.控件在使用的时候遇到点问题.在控件里画了图之后切换到其他页面,等再切换回来的时候,发现控件里画的图都不见了.这是因为VC里面,当缩小.遮挡页面后客户区域就会失效,当再次显 ...
- 使用cmd命令导入SQL文件
1 . 进入SQL安装目录下的bin目录,比如我的是在 C:\Program Files\MySQL\MySQL Server 5.5\bin目录下 2. 开始 --->运行--->输入c ...
- Alpha冲刺
第一天 日期:2018/6/16 1.今日完成任务情况以及遇到的问题 张天旭:根据系统的需求,完成数据库的设计 周甜甜:完成系统后台登录界面的设计及登录功能的实现 李蕾:完成系统后台首页的设计 张海鑫 ...
- keil5一点project就闪退
进注册表“HKEY_CURRENT_USER——SOFTWARE——Keil——矿ision5——Recent Projects”里面,保留一个默认的(我是保留了,估计删掉也可以),其余 ...
- cpu资源长期使用率过高导致系统内核锁问题
服务器跑大量高负载程序,会造成cpu soft lockup. 解决办法: #追加到配置文件中 echo 30 > /proc/sys/kernel/watchdog_thresh #查看 [r ...
- curl -d中的json存在引号怎么处理?
1\将其改写为I'\''m就可以执行 2\ curl -u elastic:mypass -X GET "localhost:9200/_analyze?pretty" -d 'a ...