打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【风宇冲】Unity3D教程宝典之Shader篇:第二十三讲GrabPass

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院

                                第二十三讲GrabPass

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

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

例1:ShaderLab用法
场景背景如下


在前端放一个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 invertit's colors
  11.        Pass {
  12.            SetTexture [_GrabTexture] { combine one-texture }
  13.        }
  14.     }
  15. }

效果如下



例2:
有背景如下


在前端新建一个旋转为(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.           #pragmavertex vert
  18.           #pragmafragment 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.              returno;
  33.           }
  34.           float4 frag(v2f i) : COLOR
  35.           {
  36.              float4texCol = tex2D(_GrabTexture,i.uv);
  37.              returntexCol;
  38.           }
  39.           ENDCG
  40.        }
  41.     }
  42. }

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


但是uv上下反了,于是
把代码36行的float4 texCol = tex2D(_GrabTexture,i.uv);
改为 float4 texCol =tex2D(_GrabTexture,float2(i.uv.x,1-i.uv.y));
效果如下


Grabpass并指定texture名称,效果也一样

  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.          "_MyGrabTexture"
  12.        }
  13.       
  14.        pass
  15.        {
  16.           Name"pass2"
  17.          CGPROGRAM
  18.           #pragmavertex vert
  19.           #pragmafragment frag
  20.          
  21.           #include"UnityCG.cginc"
  22.           sampler2D_MyGrabTexture;
  23.           float4_MyGrabTexture_ST;
  24.           struct v2f{
  25.             float4  pos : SV_POSITION;
  26.             float2  uv : TEXCOORD0;
  27.           } ;
  28.           v2f vert(appdata_base v)
  29.           {
  30.              v2f o;
  31.              o.pos =mul(UNITY_MATRIX_MVP,v.vertex);
  32.              o.uv=  TRANSFORM_TEX(v.texcoord,_MyGrabTexture);
  33.              returno;
  34.           }
  35.           float4 frag(v2f i) : COLOR
  36.           {
  37.              float4texCol = tex2D(_MyGrabTexture,float2(i.uv.x,1-i.uv.y));
  38.              returntexCol;
  39.           }
  40.           ENDCG
  41.        }
  42.     }
  43. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
猫都能学会的Unity3D Shader入门指南(一)
Unity shader 官网文档全方位学习(一)
Shader: 获取深度贴图数据
内置管线Shader升级到URP详细手册
(四)Unity纹理、贴图和材质
Unity3D Shader入门指南(二)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服