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

还是当时美术画的素材:

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

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

脚本:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class CustomRender : MonoBehaviour
  6. {
  7. public Material blendMat;
  8. public Transform maskMappingPoint;
  9. Camera mCacheCamera;
  10.  
  11. void OnRenderImage(RenderTexture src, RenderTexture des)
  12. {
  13. if (mCacheCamera == null)
  14. {
  15. mCacheCamera = new GameObject("tempCamera").AddComponent<Camera>();
  16. mCacheCamera.transform.parent = transform;
  17. }
  18.  
  19. mCacheCamera.gameObject.SetActive(true);
  20. mCacheCamera.CopyFrom(Camera.main);
  21.  
  22. var tempRT = RenderTexture.GetTemporary(src.width, src.height);
  23.  
  24. tempRT.DiscardContents();
  25.  
  26. var normalWorldLayer = << LayerMask.NameToLayer("NormalWorld");
  27. var madWorldLayer = << LayerMask.NameToLayer("MadWorld");
  28.  
  29. var cacheCullingMask = mCacheCamera.cullingMask;
  30.  
  31. //------------------------------
  32. if ((mCacheCamera.cullingMask & normalWorldLayer) == normalWorldLayer)
  33. {
  34. mCacheCamera.cullingMask ^= normalWorldLayer;
  35. }
  36.  
  37. mCacheCamera.cullingMask |= madWorldLayer;
  38. mCacheCamera.targetTexture = tempRT;
  39. mCacheCamera.Render();
  40. //------------Renderer mad world.
  41.  
  42. //------------------------------
  43.  
  44. Vector4 viewPortPoint = Camera.main.WorldToViewportPoint(maskMappingPoint.position);
  45.  
  46. viewPortPoint -= new Vector4(0.5f, 0.5f);
  47. viewPortPoint.w = maskMappingPoint.localScale.x;
  48.  
  49. blendMat.SetTexture("_MainTex", src);
  50. blendMat.SetTexture("_MadWorldTex", tempRT);
  51. blendMat.SetVector("_MaskOffset", viewPortPoint);
  52. Graphics.Blit(src, des, blendMat);
  53. //------------Blend.
  54.  
  55. mCacheCamera.cullingMask = cacheCullingMask;
  56. RenderTexture.ReleaseTemporary(tempRT);
  57. mCacheCamera.gameObject.SetActive(false);
  58. }
  59. }

Shader:

  1. Shader "Unlit/BlendShader"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _MadWorldTex("MadWorld Texture", 2D) = "white" {}
  7. _MaskTex("Mask Texture", 2D) = "white" {}
  8. _MaskOffset("Mask Offset", vector) = (,,,)
  9. }
  10.  
  11. SubShader
  12. {
  13. Tags { "RenderType"="Opaque" }
  14. LOD
  15.  
  16. Pass
  17. {
  18. CGPROGRAM
  19. #pragma vertex vert
  20. #pragma fragment frag
  21. // make fog work
  22. #pragma multi_compile_fog
  23.  
  24. #include "UnityCG.cginc"
  25.  
  26. struct appdata
  27. {
  28. float4 vertex : POSITION;
  29. float2 uv : TEXCOORD0;
  30. };
  31.  
  32. struct v2f
  33. {
  34. float2 uv : TEXCOORD0;
  35. float4 vertex : SV_POSITION;
  36. };
  37.  
  38. sampler2D _MainTex;
  39. float4 _MainTex_ST;
  40. float4 _MaskOffset;
  41.  
  42. sampler2D _MadWorldTex;
  43. sampler2D _MaskTex;
  44.  
  45. v2f vert (appdata v)
  46. {
  47. v2f o;
  48. o.vertex = UnityObjectToClipPos(v.vertex);
  49. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  50. return o;
  51. }
  52.  
  53. fixed4 frag (v2f i) : SV_Target
  54. {
  55. fixed4 col1 = tex2D(_MainTex, i.uv);
  56. fixed4 col2 = tex2D(_MadWorldTex, i.uv);
  57.  
  58. #if UNITY_UV_STARTS_AT_TOP
  59. float grabSign = -_ProjectionParams.x;
  60. #else
  61. float grabSign = _ProjectionParams.x;
  62. #endif
  63.  
  64. half2 uv = float2(, grabSign) * (i.uv - half2(0.5, 0.5)) / _MaskOffset.ww + half2(0.5, 0.5);
  65.  
  66. fixed4 mask = tex2D(_MaskTex, uv + _MaskOffset.xy);
  67. return lerp(col1, col2, -mask.a);
  68. }
  69. ENDCG
  70. }
  71. }
  72. }

一个里表世界切换的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. tablib.Dataset()操作exl类型数据之“类方法”研究

    #tablib.Dataset()操作exl类型数据之“类方法”研究 import tablib #初始化 data=tablib.Dataset() #设置列标题 data.headers=('na ...

  2. ftp相关常用命令

     工欲善其事必先利其器 00.FTP常用命令 01.SFTP命令 sftp  user@ip:/tmp

  3. Linux中的共享链接库shared libraries

    可执行文件的静态链接和动态链接静态链接会将需要的库函数在编译时一并包含, 所以体积会比较大. 使用ldd命令查看可执行文件链接的库 $ ldd /sbin/ldconfig not a dynamic ...

  4. Vista/Win7以上系统查看和清除本地DNS缓存新方法

    你是否因修改网站DNS解析后,却因本机DNS缓存而需要等待... 你是否遇到修改了本机的hosts文件后,必须重起firefox和ie才起作用... 其实只要清空DNS缓存这些问题都可以解决. 查看D ...

  5. samba服务的高级进阶配置

    本文将学习一下几个方面的内容,将会结合具体的实验来一步步实现. 1. 用户账号的映射 2. 使用IP对客户端进行访问控制 3. 使用域名对客户端进行访问控制 4. 使用通配符对客户端进行访问控制 5. ...

  6. 简述MVC

    强调:mvc不是框架而是一种设计模式 分层结构的好处:1.降低了代码之间的耦合性 2.提高了代码的重用性 一. 概述 MVC的全名Model View Controller,即模型-视图-控制器的缩写 ...

  7. 一个死去的网站shige.laiyo.com

    2017年4月份的时候,研一下刚刚开始. 爬了这个网站,现在这个网站已经关闭了,这些爬虫代码也就没用了,面向特定网站爬虫本身就是没有意义的. 爬author import requests from ...

  8. Hyperscan 介绍与安装【转】

    来源:http://blog.sina.com.cn/s/blog_913a533b0102wc38.html Hyperscan 介绍与安装 (2016-01-27 16:22:32) 转载▼   ...

  9. librbd 分析

    一.概述

  10. elk之elasticsearch 入门

    一.概述: 1.查看elasticsearch集群的健康状况: [root@node115 kibana]# curl -X GET http://192.168.39.115:9200/_cat/h ...