Unity 5 使用Projector实现纹理投射

原创 2016年06月02日 10:35:55

游戏中,我们经常需要实现将纹理投射到场景中其他物体上的效果,如地上的光环、石块上的logo、水印等。很多情况下我们可以通过灯光或者其他方式达到我们想要的效果,但是Unity已经为我们提供了一种更加便捷高效的实现方式,那就是Projector组件。

最终效果预览

这里写图片描述

准备工作

  • 首先创建工程,通过Assets->Import Package->Effects导入标准资源库中的特效素材,如下图所示。如果安装Unity时没有安装标准资源库,可以到这里单独下载并安装。

导入资源

  • 导入资源后,Project中将出现下图中的结构:

Project结构

  • 接下来就可以在场景中加入必要的元素了。

应用Projector组件

将BlobShadowProjector(Standard Shader Gallery -> Effects -> Projectors -> Prefabs)拖入场景中,Inspector面板如图:

这里写图片描述

BlobShadowProjector实现的是通过Projector组件在物体上投射一个圆形的阴影。将上图中Cookie改成我们需要的图片(注意图片属性中Alpha from Grayscale需要勾选,Wrap mode选择Clamp,当然你可以尝试不同选择看实际效果),但仍然存在不少问题,如png图片中的透明部分会被渲染成黑色,场景中有不明条纹等。
Projector的原理是为其frustum范围内的物体增加一个Pass,将我们在Projector中定义的材质渲染出来。为了解决上面所说的问题,我们可以创建自己的Shader和材质。
首先,复制Standard Shader Gallery -> Effects -> Projectors -> ProjectorMultiply,另存为ProjectorCustom,修改如下:

Shader "Projector/Custom" {
    Properties{
        _ShadowTex("Cookie", 2D) = "gray" {}
        _FalloffTex("FallOff", 2D) = "white" {}
    }
        Subshader{
        Tags{ "Queue" = "Transparent" }
        Pass{
        ZWrite Off
        ColorMask RGB
        //Blend DstColor Zero
        Blend SrcAlpha OneMinusSrcAlpha
        Offset -1, -1

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

        struct v2f {
            float4 uvShadow : TEXCOORD0;
            float4 uvFalloff : TEXCOORD1;
            UNITY_FOG_COORDS(2)
            float4 pos : SV_POSITION;
        };

        float4x4 _Projector;
        float4x4 _ProjectorClip;

        v2f vert(float4 vertex : POSITION)
        {
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP, vertex);
            o.uvShadow = mul(_Projector, vertex);
            o.uvFalloff = mul(_ProjectorClip, vertex);
            UNITY_TRANSFER_FOG(o,o.pos);
            return o;
        }

        sampler2D _ShadowTex;
        sampler2D _FalloffTex;

        fixed4 frag(v2f i) : SV_Target
        {
            fixed4 texS = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
            //texS.a = 1.0-texS.a;

            //fixed4 texF = tex2Dproj(_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
            //lerp(fixed4(1, 1, 1, 0), texS, texF.a);
            fixed4 res = texS;

            UNITY_APPLY_FOG_COLOR(i.fogCoord, res, fixed4(1,1,1,1));
            return res;
        }
            ENDCG
        }
    }
}

注释的部分为修改之前的代码

新建一个材质并将Shader选择为Projector/Custom,勾选图片的Alpha is Transparent,将新材质作为Projector组件的Material,并勾选Projector组件的Orthographic复选框,得到如下效果:

这里写图片描述

我们发现图片不仅投射到地面和方块上,也投射到了人物上,这显然不是我们想要的效果,不过这个问题处理起来很简单,只需要新建一个Player的Layer,将人物的Layer选成Player,然后将Projector的Ignore Layers设置成Player得到了我们的最终效果了。

总结

Projector是一个非常有用的组件,除了我们上面实现的效果,还能用来廉价的实现投影(如我们最开始使用的BlobShadowProjector)、特殊光效(可以用来代替Cookie或者范围光,但是更加高效)等效果,通过尝试不同的设置和不同的Shader,我们还会得到更多有意思的效果。

用Unity的Projector制作基地范围效果

效果图如下:   投影器(Projector)可以将任意与它的平截头体相交的材质投影到场景上。该材质必须使用特殊类型的着色器的才能正常工作。所以shader的编写非常重要. Projector的属性...

Unity3D游戏制作(三)——移动平台上的角色阴影制作

本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处。 http://blog.csdn.net/amazonzx/article/details/7973740   本文将重点介绍两...
  • Amazonzx
  • Amazonzx
  • 2012年09月13日 10:21
  • 29606

【Unity Shader】结合Projector和Rendertexture实现实时阴影

之前已在简书上发过,这里重新整理了一下,并附上实现代码。 在unity中实现阴影的文章网上看了不少,包括常用的shadowMap,或直接投射Rendertexture等。比如unity中实现sha...

UnityEffects(2)之ProjectorShadow(手游上的实时阴影方案)

UnityEffects(2)之(2)ProjectorShadow(手游上的实时阴影方案) 上一篇说到了在unity5.x中实现shadowMap的方法(UnityEffects(1)之shado...

Unity3D手游开发日记(1) - 移动平台实时阴影方案

自从去了某大公司,工作环境比较封闭,就没写过博客了,离开以后,开发移动游戏,相对自由,又可以重操旧业,分享一下自己的心得. 阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各...

Shader投影效果

原文地址:http://www.redblack.cn/?p=147 在虚拟现实中有时候会用到投影效果,比如将灯光投射到墙壁,人物倒影,火焰投影效果等等,如下: 在wifi上有一篇...

[Unity&特效]使用Projector投影仪组件在哪里下载

由于参考资料 1,2 已经把 如何 使用 Projector投影仪来制作角色脚下的特效圆环 以及 相关shader 设置代码 写得很详细了。本文不赘述 如何找到 不同 版本 的Unity  的  ...

unity移动平台阴影解决方案

unity移动平台角色阴影解决方案Projector Shadow制作思路:主要是利用一个正交的camera去获取阴影模型的体面,赋予给创建的一个rendertexture,然后利用projector...

[Unity3D]如何给物体添加阴影效果

阴影在3D游戏中是非常重要的一个细节,所以这一章我们专门介绍如何给物体添加阴影效果。 我们在运行前面的Demo的时候会有一种感觉,就是经过大树的时候会有阴影投射到方块上。 那么下面就来介绍一下如何...

Unity3D shader 人物被选中光环/技能范围光环

好长一段时间都没写过博客了,身边一有各种杂七杂八的事就懒散下来了,我要振作(╯‵□′)╯""┻━┻。楼主在写这篇博客的时候室友突然要和几个同班同学去云南玩耍个一星期,搞得楼主差点没心情继续往下写了,我...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity 5 使用Projector实现纹理投射
举报原因:
原因补充:

(最多只允许输入30个字)