加载中…
个人资料
风宇冲
风宇冲
  • 博客等级:
  • 博客积分:0
  • 博客访问:0
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:大 中 小

【风宇冲】Shader:二十三GrabPass

(2013-03-17 07:55:03)
标签:

it

unity

unity3d

unity3d教程

分类: Unity3d之Shader篇

原创文章如需转载请注明:转载自风宇冲博客

                                第二十三讲GrabPass

GrabPass是一种特殊的pass类型。当物体将要被绘制时,它抓取屏幕内容并绘制到一张texture里。
总体来说GrabPass开销较大,不如 AlphaBlend等指令。故能用AlphaBlend等指令实现的效果尽量用指令,不得不用GrabPass时才用GrabPass。

(1)GrabPass{} 抓取当前屏幕内容,每次使用的开销都非常昂贵。 texture用_GrabTexture获取(2)GrabPass{"TextureName"}将抓取屏幕内容并保存至一张texture里。每帧只为第一次使用这张纹理的物体做一次,这种更高效

例1:ShaderLab用法
场景背景如下
http://s8/mw690/47113292t7c01fe092f17&690

在前端放一个cube,shader如下
  1. Shader "Custom/MyGrabPass" {
  2.     Properties {
  3.         _MainTex ("Base (RGB)", 2D) = "white" {}
  4.     }
  5.      SubShader {
  6.         // Draw ourselves after all opaque geometry
  7.         Tags { "Queue" = "Transparent" }
  8.         // Grab the screen behind the object into _GrabTexture
  9.         GrabPass { }
  10.         // Render the object with the texture generated above, and invert it's colors
  11.         Pass {
  12.             SetTexture [_GrabTexture] { combine one-texture }
  13.         }
  14.     }
  15. }

效果如下

http://s3/mw690/47113292td813ec8d76c2&690

例2:
有背景如下
http://s12/bmiddle/47113292td8141609a4cb&690

在前端新建一个旋转为(90,180,0)的plane,代码如下
  1. Shader "Custom/MyGrabPass" {
  2.     Properties {
  3.         _MainTex ("Base (RGB)", 2D) = "white" {}
  4.     }
  5.     SubShader
  6.     {
  7.         Tags{"Queue"="Transparent"}
  8.      
  9.         GrabPass
  10.         {
  11.         }
  12.        
  13.         pass
  14.         {
  15.             Name "pass2"
  16.             CGPROGRAM
  17.             #pragma vertex vert
  18.             #pragma fragment frag
  19.            
  20.             #include "UnityCG.cginc"
  21.             sampler2D _GrabTexture;
  22.             float4 _GrabTexture_ST;
  23.             struct v2f {
  24.                 float4  pos : SV_POSITION;
  25.                 float2  uv : TEXCOORD0;
  26.             } ;
  27.             v2f vert (appdata_base v)
  28.             {
  29.                 v2f o;
  30.                 o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
  31.                 o.uv =  TRANSFORM_TEX(v.texcoord,_GrabTexture);
  32.                 return o;
  33.             }
  34.             float4 frag (v2f i) : COLOR
  35.             { 
  36. #if UNITY_UV_STARTS_AT_TOP
  37.                 float2 uv = float2(i.uv.x,1-i.uv.y);
  38.             #else
  39.                 float2 uv = i.uv;
  40.             #endif
  41.                 float4 texCol = tex2D(_GrabTexture,uv);
  42.                 return texCol;
  43.             }
  44.             ENDCG
  45.         }
  46.     }
  47. }

效果如下,就是抓取了屏幕背景并贴到前端的plane上

http://s16/mw690/47113292td8141609335f&690

0

阅读┊ 收藏 ┊ 喜欢▼ ┊打印┊举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有