Unity3D教程宝典之Shader篇:第二十三讲GrabPass

转载自风宇冲Unity3D教程学院

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

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

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

在前端放一个cube,shader如下

Shader "Custom/MyGrabPass" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
     SubShader {
        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }
        // Grab the screen behind the object into _GrabTexture
        GrabPass { }
        // Render the object with the texture generated above, and invert it‘s colors
        Pass {
            SetTexture [_GrabTexture] { combine one-texture }
        }
    }
}

  

效果如下

例2:
有背景如下

在前端新建一个旋转为(90,180,0)的plane,代码如下

Shader "Custom/MyGrabPass" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags{"Queue"="Transparent"}

        GrabPass
        {
        }

        pass
        {
            Name "pass2"
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            sampler2D _GrabTexture;
            float4 _GrabTexture_ST;
            struct v2f {
                float4  pos : SV_POSITION;
                float2  uv : TEXCOORD0;
            } ;
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                o.uv =  TRANSFORM_TEX(v.texcoord,_GrabTexture);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                float4 texCol = tex2D(_GrabTexture,i.uv);
                return texCol;
            }
            ENDCG
        }
    }
}

  

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


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

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

Shader "Custom/MyGrabPass" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags{"Queue"="Transparent"}

        GrabPass
        {
            "_MyGrabTexture"
        }

        pass
        {
            Name "pass2"
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            sampler2D _MyGrabTexture;
            float4 _MyGrabTexture_ST;
            struct v2f {
                float4  pos : SV_POSITION;
                float2  uv : TEXCOORD0;
            } ;
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                o.uv =  TRANSFORM_TEX(v.texcoord,_MyGrabTexture);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                float4 texCol = tex2D(_MyGrabTexture,float2(i.uv.x,1-i.uv.y));
                return texCol;
            }
            ENDCG
        }
    }
}

  

时间: 2024-10-16 02:42:26

Unity3D教程宝典之Shader篇:第二十三讲GrabPass的相关文章

Unity3D教程宝典之Shader篇:第三讲Vertex&Fragment Shader

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 Vertex and Fragment Shader:最强大的Shader类型,也是本系列的重点,下文中简称V&F Shader,属于可编程渲染管线. 使用的是CG/HLSL语法.分为2个部分vertex顶点部分和Fragment像素部分.下面依然通过写几个简单的Shader来学习. 例一:显示一张贴图 新建Unity工程,新建一个Cube立方体,新建一个名为Exam1的Shader(Project视图->Create->Sh

Unity3D教程宝典之Shader篇

教程目录 基础讲:Shader学习方法基础讲:基础知识特别讲:常见问题解答特别讲:CG函数 第一讲: Shader总篇第二讲: Fixed Function Shader 第三讲: Vertex&Fragment Shader基础 第四讲: 制作一个美丽的地球第五讲:LOGO闪光效果 第六讲:TexGen第七讲:流程图第八讲:Why CG?第九讲:Render Path第十讲:雾化第十一讲:阴影面剔除及深度测试第十二讲:alpha测试第十三讲:alpha混合第十四讲:Surface Shader

Unity3D教程宝典之Shader篇:第二十讲法线贴图

转载自风宇冲Unity3D教程学院 上一讲我们讲了凹凸贴图以及生成法线贴图. 这一讲来谈谈怎么使用法线贴图. 一:法线贴图的原理 二:法线贴图的实现 三:法线贴图的使用 四:法线贴图的格式 一:法线贴图的原理 光照效果很大程度上是由垂直于物体表面的法线决定的,因为法线影响反射光的方向.均匀垂直的法线是镜面贴图.但是有时候我们会给一个平面使用砖墙贴图,砖墙应该是凹凸不平的,而如果让砖墙使用该平面的法线的话,画面就会很假,神马?一面墙像镜子一样反光=.= 而如果按真实砖墙去做模型的话,即做高精度模型

Unity3D教程宝典之Shader篇:第二十四讲Reflection Mapping

转载自风宇冲Unity3D教程学院 简介 Reflection Mapping,又叫Environment Mapping.对应TexGen的SphereMap和CubeReflect.是最快的reflect周围环境的算法 最早出现的是Sphere Mapping,之后被Cube Mapping取代.Reflection Mapping比射线追踪(Ray Tracing)高效得多 Reflection Mapping的前提是2个假设 (1)入射线来自无限距离 (2)物体是凸的,没有自身的相互反射

Unity3D教程宝典之Shader篇:第二十六讲ImageEffects_Twirl

转载自风宇冲Unity3D教程学院 Twirl是一个全屏画面扭曲的效果,新仙剑的战斗切换有用到这个效果. 主要有三个设置: center  扭曲的中心点 radius 扭曲的范围 angle 扭曲的角度 用到了如下函数 Matrix4x4.TRS(Vector3 pos, Quaternion rotate,Vector3 scale) 创建一个包括位移,旋转,缩放的矩阵 Matrix4x4 rotationMatrix = Matrix4x4.TRS(Vector3.zero, Quatern

Unity3D教程宝典之Shader篇:第二十二讲MultiPass

转载自风宇冲Unity3D教程学院 实现高级效果时,往往需要用到多个Pass. 用AlphaBlend混合例1:将一张图 分别用红色 和 绿色渲染并混合 (1)新建场景新建一个plane(2)新建一个material并随便赋张贴图,并让plane使用该materialmaterial所使用的shader如下 Shader "Custom/MyMultiPass" { Properties { _MainTex ("Base (RGB)", 2D) = "w

Unity3D教程宝典之Shader篇:第二十五讲Blur

转载自风宇冲Unity3D教程学院 Blur模糊其实理解了以后非常简单.核心原理就是1个点的颜色 并不用该点的颜色,而是用该点周围所有点的均值(1)确定取点范围, 例如周围3个像素 或者周围10个像素(2)确定各点权重,这也是高斯模糊的由来,主要颜色分配的比重为正态分布,即高斯分布. 例子1:最简单的模糊(1)新场景,plane上面放一张贴图(2)plane上的shader如下 Shader "Custom/ObjectBlur" { Properties { _MainTex (&q

Unity3D教程宝典之Shader篇:第二讲Fixed Function Shader

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 Fixed function shader简介:  属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的情况.使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似. 例一:显示单一颜色下面我们来看第一个例子,显示单一颜色,注释写得挺详细了,照着格式写即可. //根Shader Shader "Custom/1_1color" { // 属性 Propertie

Unity3D教程宝典之Shader篇:第十二讲 Alpha测试

转载自风宇冲Unity3D教程学院 引言:本讲和下一讲主要讲Alpha即透明通道有关的内容.RGBA,其中最终在屏幕上显示的只有RGB即 红绿蓝组成的颜色,Alpha并没有任何颜色显示.A只是辅助颜色运算特别是多图层运算而已.例如在单图层的情况下(1,1,1,0.8)输出的是(1,1,1)*0.8即 浅灰色(0.8,0.8,0.8),和(0.8,0.8,0.8)是等价的.但是假如不再是单图层而背景为绿色(0,1,0,1)的时候,(0.8,0.8,0.8)就不知道怎么去运算了,而(1,1,1,0.