Shader笔记——5.渲染纹理

摘要:
Unity的渲染纹理Unity为RTT定义了一种特殊的纹理类型,这是一种在运行时创建和更新的特殊类型的纹理。若要在Unity中使用它们,必须首先创建新的渲染纹理并将摄影机指定给渲染纹理。使用阴影效果渲染纹理使用渲染纹理可以简单地在移动端实现实时阴影渲染。将附加摄影机设置为正交摄影机,并将其放置在需要阴影效果的对象上方的适当位置。为摄影机设置渲染纹理。在对象下方添加四边形以显示渲染纹理。

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入门

免责声明:文章转载自《Shader笔记——5.渲染纹理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇产品经理 数据分析epoll 应用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

unity 2d 和 NGUI layer

http://blog.csdn.net/xtxy/article/details/37876825 在使用unity2d开发游戏的时候,使用了NGUI作为界面,本来二者配合得还挺好,但是一个使用场景出现了问题,就是一个ngui的sprite需要放置在unity2d sprite后面显示,也就是用ngui得sprite作为背景,结果发现替换sprite的a...

Unity中操作手机常用功能

最近在测试一个小Demo,用到很多手机功能。在这里一一贴出来,以供后期参考 备注:在打包发布时,Plugins下一定要导入如下dll文件,否则build后无法连接数据库<I18N,I18N.West,System.Data,Mysql.Data> 1、操作手机震动; Handheld.Vibrate(); //震动前自己加条件判断 2、Inpu...

Unity小知识点大全(一)

原帖地址:https://zhuanlan.zhihu.com/p/54763553 1. 高亮选择 在Scene面板右上角的Gizmo下拉列表中,可以通过设置Selection Outline选项决定是否在选中物体时显示边缘高亮的标识。 2.Pixel Perfect Camera 在摄像机上挂载Pixel Perfect Camera组件能够使2D像...

《图说VR入门》——googleVR 他山之玉

本文章由cartzhang编写,转载请注明出处。 所有权利保留。 文章链接:http://blog.csdn.net/cartzhang/article/details/53125482 作者:cartzhang 《图说VR入门》——googleVR 他山之玉 之前分析了一些GoogleVR的代码,画了一些图。 常言:他山之石,可以攻玉。个人觉得...

unity Mathf 数学运算汇总

在使用unity做游戏的过程中难免会遇到这样那样的数学运算,比如简单的正弦,余弦等。其实,在c#的Mathf 函数中 还有很多方便我们开发使用的 数学函数。在此,分享下比较全面的Mathf解析(由网上收集),方便大家参考 使用。 Mathf 数学运算 Mathf.Abs绝对值 计算并返回指定参数 f 绝对值。 Mathf.Acos反余弦 static fu...

[Unity3D]引擎崩溃、异常、警告、BUG与提示总结及解决方法

转 http://blog.sina.com.cn/s/blog_5b6cb9500101ai9h.html   此贴会持续更新,都是项目中常会遇到的问题,总结成贴,提醒自己和方便日后检查,也能帮到有需要的同学。 若各位有啥好BUG好异常好警告好崩溃可以分享的话,请多多指教。xuzhiping7#qq.com。   1.U3D经常莫名奇妙崩溃。   一般是...