Shader笔记——2.渲染纹理

Unity渲染纹理

渲染目标纹理RTT(Render Target Texture),指GPU允许将三维场景渲染到一个中间缓存中;

Unity为渲染目标纹理RTT定义了一种专门的纹理类型————渲染纹理(Render Texture)

使用方式:

  • 方式一,在工程目录下创建一个渲染纹理,设置Camera的渲染目标为该渲染纹理
  • 方式二,使用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不宜过大默认,256256或者512512即可

简单阴影效果:

镜面效果

玻璃效果

REF

书籍:

OpenGL宝典、Unity Shader入门

猜你喜欢

转载自www.cnblogs.com/sylvan/p/9501881.html
今日推荐