Shader混合模式--正片叠底、滤色、叠加
2015-08-14 17:22
323 查看
叠加在书本168页。
Shader "Custom/BlendMode_Effect" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Blendtex("Blend Texture",2D) = "white"{}
_Opacity("Blend Opacity",Range(0,1)) = 1
}
SubShader {
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform sampler2D _BlendTex;
fixed _Opacity;
fixed4 frag(v2f_img i) : COLOR
{
fixed4 renderTex = tex2D(_MainTex,i.uv);
fixed4 blendTex= tex2D(_BlendTex,i.uv);
//fixed4 blendedMultiply = renderTex * blendTex;
fixed4 blendedScreen = (1.0 - ((1.0 - renderTex) * (1.0 - blendTex)));//这里是颜色计算核心
renderTex= lerp(renderTex,blendedScreen,_Opacity);
return renderTex;
}
ENDCG
}
}
}
叠加模式的算法
正片叠底 —— 就是把两层图像的像素相乘,最后会得到一个更暗的图像。这个模式是对称的,也就是说交换基色和混合色得到的结果是一样的。
,其中a是基色,b是混合色。
滤色 —— 首先把两层图像的像素值取互补数,然后将它们相乘,最后再去互补数。这和正片叠底得到的结果是相反的。它会得到一个更亮的图像。
,其中a是基色,b是混合色。
叠加 —— 结合了正片叠底和滤色两种混合模式。基色中亮色的部分会更加亮,而暗色的部分会更暗。
,其中a是基色,b是混合色。
更多信息:http://blog.csdn.net/candycat1992/article/details/39343309
Shader "Custom/BlendMode_Effect" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Blendtex("Blend Texture",2D) = "white"{}
_Opacity("Blend Opacity",Range(0,1)) = 1
}
SubShader {
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform sampler2D _BlendTex;
fixed _Opacity;
fixed4 frag(v2f_img i) : COLOR
{
fixed4 renderTex = tex2D(_MainTex,i.uv);
fixed4 blendTex= tex2D(_BlendTex,i.uv);
//fixed4 blendedMultiply = renderTex * blendTex;
fixed4 blendedScreen = (1.0 - ((1.0 - renderTex) * (1.0 - blendTex)));//这里是颜色计算核心
renderTex= lerp(renderTex,blendedScreen,_Opacity);
return renderTex;
}
ENDCG
}
}
}
fixed OverlayBlendMode(fixed basePixel, fixed blendPixel) { if (basePixel < 0.5) { return (2.0 * basePixel * blendPixel); } else { return (1.0 - 2.0 * (1.0 - basePixel) * (1.0 - blendPixel)); } }
fixed4 frag(v2f_img i) : COLOR { //Get the colors from the RenderTexture and the uv's //from the v2f_img struct fixed4 renderTex = tex2D(_MainTex, i.uv); fixed4 blendTex = tex2D(_BlendTex, i.uv); fixed4 blendedImage = renderTex; blendedImage.r = OverlayBlendMode(renderTex.r, blendTex.r); blendedImage.g = OverlayBlendMode(renderTex.g, blendTex.g); blendedImage.b = OverlayBlendMode(renderTex.b, blendTex.b); // Adjust amount of Blend Mode with a lerp renderTex = lerp(renderTex, blendedImage, _Opacity); return renderTex; }
叠加模式的算法
知识补习
这里增加一个内容,就是对各种混合模式的理解。正片叠底(Multiply)和滤色(Screen)
正片叠底(Multiply)和滤色(Screen)是两种基本的混合模式,分别用于使图片变暗和变亮。它们之间的组合还可以形成更复杂的混合模式,如叠加(Overlay)和柔光(Soft Light)。正片叠底 —— 就是把两层图像的像素相乘,最后会得到一个更暗的图像。这个模式是对称的,也就是说交换基色和混合色得到的结果是一样的。
,其中a是基色,b是混合色。
滤色 —— 首先把两层图像的像素值取互补数,然后将它们相乘,最后再去互补数。这和正片叠底得到的结果是相反的。它会得到一个更亮的图像。
,其中a是基色,b是混合色。
叠加 —— 结合了正片叠底和滤色两种混合模式。基色中亮色的部分会更加亮,而暗色的部分会更暗。
,其中a是基色,b是混合色。
更多信息:http://blog.csdn.net/candycat1992/article/details/39343309
相关文章推荐
- C++时间与字符串转换
- More Effective C++ 学习笔记(1)
- linux目录 ~ 和/的区别
- Chromium浏览器组件设计意图
- (3)创建一个查找对话框
- habernate 缓存
- try{} finally{} 中 finally的执行顺序
- hdu1237(简单计算器) LinkedList类实现栈和队列功能
- Ajax 相关文档链接
- javascript -- 绘制箭头
- 动态设置数据模版
- elasticsearch手动控制分片分布
- 软件系统演示脚本实践(草稿)
- HashMap实现原理
- 修改 EditText 中的光标显示的位置
- Linux下如何编译并运行C程序
- 《C++核心思想》学习笔记(4)
- 智渔课堂官方免费教程四十四 :Java流之字文件File类
- FT:android悬浮窗口的实现
- Terra 轨道