之前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. 获取公钥证书的DN(Distinguished Name)

    DN --  Distinguished Name,证书持有人的唯一标识符. 可以通过下面的openssl命令来打印出证书的DN. openssl x509 -subject -nameopt RFC ...

  2. Npoi导出excel整理(附源码)

    前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...

  3. VirtualBox-5.0.16设置windows与ubuntu的共享文件夹

    操作环境:win7.VirtualBox-5.0.16.ubuntukylin-14.04.2-desktop-amd64 1.先下载安装VBoxGuestAdditions_5.0.17-10614 ...

  4. mysql Substr与char_length函数的应用

    update lee set name = SUBSTR(name, CHAR_LENGTH('lee')+1) where name like "lee%" char_lengt ...

  5. Jenkins的安装(最为简单的安装方法)

    1.Jenkins的安装(最为简单的安装方法) (1)下载Jenkins(一个war文件) (2)cmd运行:java -jar jenkins.war [Jenkins需要IDK1.5以上的版本] ...

  6. oracle初始化化表空间用户权限

    oracle单实例安装完毕,需要初始化表空间.用户.等信息.不积跬步,何以至千里! 用sys账户登录oracle数据库,以此来完成所有操作! 01.创建临时表空间 create temporary t ...

  7. Mac OS X上安装配置apache服务器

    说明:Mac在安装完成Mac系统的时候它已经自带了apache服务器,接下来就是配置和将它启动运行了.那么接下来要做的事情就是: 1.配置apache的配置文件 2.设置虚拟主机 启动并查看apach ...

  8. AllInOneConveter——编码转换工具

    一.Url编码解码 二.Base64编码解码 三.\u形式Unicode和汉互转 四.Md5加密 五.源代码 https://github.com/FrankFan/AllInOneConverter ...

  9. 【win7 + win server 2008】设置定时任务,设置.bat 文件去执行php脚本 == 用来配合爬虫程序简直不要太爽

    Windows Server 2008中使用计划任务定时执行BAT bat进行PHP脚本的执行 一.首先进行任务管理器设置  每隔1分钟执行.BAT 文件配置 首先Windows Server 200 ...

  10. 找不到android-support-v4 包的解决办法

    有时候在开发过程中,总是会遇到一些莫名奇妙的错误,或者在使用fragement和viewpage的时候,就会出现下面这个错误,如果出现找不到android-support-v4 包的时候,可以使用下面 ...