之前GGJ实现了一个,但是实现方式上有很多冗余。今天正好在做一个类似的东西,重新做了一个版本

还是当时美术画的素材:

由于里表世界是不同的内容,是两张材质。所以拆分成不同Layer之后,里世界单独渲染一次

最后用Graphics做一下混合的屏幕处理即可。

脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class CustomRender : MonoBehaviour
{
public Material blendMat;
public Transform maskMappingPoint;
Camera mCacheCamera; void OnRenderImage(RenderTexture src, RenderTexture des)
{
if (mCacheCamera == null)
{
mCacheCamera = new GameObject("tempCamera").AddComponent<Camera>();
mCacheCamera.transform.parent = transform;
} mCacheCamera.gameObject.SetActive(true);
mCacheCamera.CopyFrom(Camera.main); var tempRT = RenderTexture.GetTemporary(src.width, src.height); tempRT.DiscardContents(); var normalWorldLayer = << LayerMask.NameToLayer("NormalWorld");
var madWorldLayer = << LayerMask.NameToLayer("MadWorld"); var cacheCullingMask = mCacheCamera.cullingMask; //------------------------------
if ((mCacheCamera.cullingMask & normalWorldLayer) == normalWorldLayer)
{
mCacheCamera.cullingMask ^= normalWorldLayer;
} mCacheCamera.cullingMask |= madWorldLayer;
mCacheCamera.targetTexture = tempRT;
mCacheCamera.Render();
//------------Renderer mad world. //------------------------------ Vector4 viewPortPoint = Camera.main.WorldToViewportPoint(maskMappingPoint.position); viewPortPoint -= new Vector4(0.5f, 0.5f);
viewPortPoint.w = maskMappingPoint.localScale.x; blendMat.SetTexture("_MainTex", src);
blendMat.SetTexture("_MadWorldTex", tempRT);
blendMat.SetVector("_MaskOffset", viewPortPoint);
Graphics.Blit(src, des, blendMat);
//------------Blend. mCacheCamera.cullingMask = cacheCullingMask;
RenderTexture.ReleaseTemporary(tempRT);
mCacheCamera.gameObject.SetActive(false);
}
}

Shader:

Shader "Unlit/BlendShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MadWorldTex("MadWorld Texture", 2D) = "white" {}
_MaskTex("Mask Texture", 2D) = "white" {}
_MaskOffset("Mask Offset", vector) = (,,,)
} SubShader
{
Tags { "RenderType"="Opaque" }
LOD 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
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
float4 _MainTex_ST;
float4 _MaskOffset; sampler2D _MadWorldTex;
sampler2D _MaskTex; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
fixed4 col1 = tex2D(_MainTex, i.uv);
fixed4 col2 = tex2D(_MadWorldTex, i.uv); #if UNITY_UV_STARTS_AT_TOP
float grabSign = -_ProjectionParams.x;
#else
float grabSign = _ProjectionParams.x;
#endif half2 uv = float2(, grabSign) * (i.uv - half2(0.5, 0.5)) / _MaskOffset.ww + half2(0.5, 0.5); fixed4 mask = tex2D(_MaskTex, uv + _MaskOffset.xy);
return lerp(col1, col2, -mask.a);
}
ENDCG
}
}
}

一个里表世界切换的shader效果的更多相关文章

  1. 利用jquery写的一个TAB页切换效果

    函数如下 /** *切换效果 */ function switab(tab,con,tab_c_css,tab_n_css,no) { $(tab).each(function(i){ if(i == ...

  2. 教你用webgl快速创建一个小世界

    收录待用,修改转载已取得腾讯云授权 作者:TAT.vorshen Webgl的魅力在于可以创造一个自己的3D世界,但相比较canvas2D来说,除了物体的移动旋转变换完全依赖矩阵增加了复杂度,就连生成 ...

  3. Android开发之ViewPager实现多页面切换及动画效果(仿Android的Launcher效果)

    Android开发中经常会有引导页或者切换页面等效果,本文采用ViewPager结合动画效果来实现仿Launcher以及页面切换的效果.源码地址在文章最后给出下载. 效果图如下:       1.Vi ...

  4. AndroidScreenSlide项目切换view动画效果《IT蓝豹》

    AndroidScreenSlide项目切换view动画效果 AndroidScreenSlide项目中有几个不错的效果,一:Card Flip翻页立体效果,二:Screen Slide 左右切换vi ...

  5. [从 0 开始的 Angular 生活]No.38 实现一个 Angular Router 切换组件页面(一)

    前言 今天是进入公司的第三天,为了能尽快投入项目与成为团队可用的战力,我正在努力啃官方文档学习 Angular 的知识,所以这一篇文章主要是记录我如何阅读官方文档后,实现这个非常基本的.带导航的网页应 ...

  6. 纯CSS完成tab实现5种不同切换对应内容效果

    很常用的一款特效纯CSS完成tab实现5种不同切换对应内容效果 实例预览 下载地址 实例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  7. jquery 实现重复点击一个元素时不重复执行效果

    jquery 实现重复点击一个元素时不重复执行效果 这需要用到jquery的stop方法 实例 停止当前正在运行的动画: $("#stop").click(function(){ ...

  8. 一个很酷的加载loading效果--IT蓝豹

    一个很酷的加载loading效果,自定义LeafLoadingView实现,LeafLoadingView继承view, 本例子主要由以下几点构成 (1):RotateAnimation实现叶子旋转 ...

  9. Tab选项卡切换卡JS效果

    <script type="text/javascript"> /* tab切换选项卡js效果 writed by *** 2010.08.13 1.currentid ...

随机推荐

  1. idea 配置svn

        1.情景展示 idea安装好后,如何配置svn? 2.分析 由于没有针对idea的svn插件,因此只能选择安装svn的客户端. 3.解决方案 第一步:下载小乌龟SVN客户端: 官网地址:htt ...

  2. 深入理解JVM(三)——垃圾收集策略具体解释

    Java虚拟机的内存模型分为五个部分.各自是:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区. 这五个区域既然是存储空间,那么为了避免Java虚拟机在执行期间内存存满的情况,就必须得有一个垃圾收 ...

  3. 单目视觉里程计 mono vo

    之前为了修改svo进行了一些不同的尝试,两个视频demo在以下. 效果1 视频链接: https://v.qq.com/x/page/d0383rpx3ap.html 在不同数据集上測试 效果2 视频 ...

  4. V-rep学习笔记:碰撞检测与距离计算

    V-REP可以在几何组件中快速判断各种干扰与碰撞,以及计算多个组件间的最小距离. 碰撞检测 V-REP可以检测两个碰撞体实体(Collidable objects are objects that c ...

  5. kibana对logstash监控获取不到数据

    需求: kibana监控elasticsearch+kibana+logstash的性能寻找,性能瓶颈! 发现启动logstash加载logstash.yml,不读取配置好的xpack.monitor ...

  6. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  7. Emacs的sr-speedbar中使能Go-mode

    sr-speedbar使用了speedbar的文件检索功能,但是Emacs24自带的speedbar不支持go文件预览,下面是在speedbar中使能go-mode的一种方法: 1,按F10启动菜单栏 ...

  8. <转>LUA语法分析

    本文选自:http://www.cnblogs.com/nazhizq/p/6516561.html 一步步调试,在lparser.c文件中luaY_parser函数是语法分析的重点函数,词法分析也是 ...

  9. CTF SQL注入知识点

    理解常用的登录判断 select * from user where username='admin' and password='123' 数据库元信息 infomation_schema 懂PHP ...

  10. 关于ARP协议

    什么是arp协议: arp协议是地址解析协议,英文是address resolution protocol 通过IP地址可以获得mac地址 两个主机的通信归根到底是MAC地址之间的通信 在TCP/IP ...