Shader笔记——5.渲染纹理

Unity的渲染纹理(Render Texture)

Unity为渲染目标纹理RTT,定义了一种专门的纹理类型——渲染纹理(Render Texture)是在运行时创建和更新的特殊类型纹理 (texture) 。在Unity中使用它们,要先创建新的渲染纹理并指定摄像机到渲染到该渲染纹理中。随后就可以和普通纹理一样在材质面板中使用该渲染纹理。

  • 渲染目标纹理RTT(Render Target Texture)是指GPU允许将三维场景渲染到一个中间缓存中;
  • Unity的渲染纹理 在Unity5.0之前一直是专业版中的功能,5.0之后加入免费版中;

Usage:

方式一:在工程目录下创建一个渲染纹理,设置Camera的渲染目标为该渲染纹理;

方式二:另一种获取屏幕图像的方式GrabPass,使用GrabPass命令Unity将屏幕图像放置在一个渲染纹理中,之后就可以将渲染纹理当做普通纹理来进行自己需要的处理。

渲染纹理的使用

阴影效果

使用渲染纹理可以简单的实现移动端的实时阴影绘制,将额外的一个Camera设置成正交摄像机放置于需要阴影效果的物体上方合适位置,并为该Camera设置渲染纹理,物体下方添加一个Quad来显示该渲染纹理。

Shader "Custom/ProjectorShadowShader"
{
    Properties
    {
        _Color("Main Color",Color) = (1,1,1,1)
        _MainTex("Render Tex",2D) = "white"{}
        _Cutoff("Alpha Cutoff",Range(0,1)) = 0.2
    }
    SubShader
    {
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "TransparentCutout"
        }

        Lighting off
        ZWrite off
        Blend SrcAlpha OneMinusSrcAlpha

        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            float4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Cutoff;

            struct a2v
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            fixed4 frag(v2f i):SV_Target
            {
                fixed4 c1 = tex2D(_MainTex , i.uv);
                if(c1.a < _Cutoff)
                    clip(c1.a - _Cutoff);
                else
                {
                    c1.rgb = c1.rgb * float3(0,0,0);
                    c1.rgb = c1.rgb + _Color;
                    c1.a = _Color.a;
                }
                return c1;
            }

            ENDCG
        }
    }
}

注意事项:

  • 负责投影的Camera设置为正交
  • RenderTexture的Size不宜过大默认,256 256或者512 512即可

简单阴影效果:

simpleshadow

镜面效果

使用渲染纹理来实现镜面效果,将摄像机获取的所需图像做为纹理输入,按照镜面翻转uv坐标的x之后采样输出即可。

Shader "Custom/MirrorShader"
{
    Properties
    {
        _MainTex("Main Tex",2D) = "white"{}
    }
    SubShader
    {
        Tags
        {
            "Queue" = "Geometry"
            "RenderType" = "Opaque"
        }
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            sampler2D _MainTex;

            struct a2v
            {
                float4 vertex : POSITION;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;

                o.uv.x = 1 - o.uv.x;

                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return tex2D(_MainTex,i.uv);
            }

            ENDCG
        }
    }
    Fallback Off
}

简单镜面效果:

simplemirror

GrabPass的使用

玻璃效果

TODO

REF

文档:

https://docs.unity3d.com/Manual/class-RenderTexture.html

书籍:

OpenGL宝典、Unity Shader入门

原文地址:https://www.cnblogs.com/sylvan/p/11223007.html