加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【风宇冲】Projector

(2013-11-16 16:59:28)
标签:

it

unity

unity3d

unity3d教程

分类: Unity3d之代码功能

原创文章如需转载请注明:转载自风宇冲博客

                                  Projector 

【原理】

Projector能将一个Material投影到所有在设定的平截头体内的物体上。通常包含两张贴图Cookie和Falloff。Cookie就是投影的图案,Falloff的作用主要是根绝距离来决定投影的Alpha即明暗。Falloff左边为白色,alpha值为1,对应投影距离最近时最亮,右边接近全黑,alpha值为0,表示投影距离变远时投影会渐渐接近透明甚至看不见。

http://s10/mw690/001iGO8Ggy6EgGjd45X09&690

【可以实现】

0 角色选择光圈

1 普通圆点阴影(blob shadow)

2 伪动态阴影(Fake Dynamic shadow)

3 光的投影

4 投影仪(根据Meterial的贴图,可以是图片,视频,另一个相机看到的景象)

5 3D或者2D手电筒的效果



【使用步骤】

一. 创建Projector.

   可以创建空GameObject,然后从Component处添加Projector组件如下图

http://s4/small/001iGO8Ggy6EgEIvj5F73&690

  也可以Import Package-> Projector,导入Projector包。包内容如下

http://s2/mw690/001iGO8Ggy6EgEIM5jj01&690

二:注意事项

1.确保Cookie Texture一定要设置为Clamp

2.为了避免projector bleeding, Cookie Texture 开启Border Mipmaps选项, 或者直接禁用Mipmap

http://s9/mw690/47113292td92fd7bb1ad8&690


FallOff

不管是orthographic还是不是。

如果不用FallOff, 投影下来的都是最亮即alpha为1的cookie,并且会向frustrum的正反2个方向投影,造成我们并不想看到的“双重投影”的效果。用系统包带的Falloff贴图的话。投影会随着距离变淡。


【实例演示】

例0:角色脚下的光圈

http://s2/small/47113292td92fd7b0c111&690

projector所使用的shader如下,再加上脚本控制projector旋转即可。

Shader "Custom/Circle" {
   Properties {
      _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }
   }
   Subshader {
      Tags { "RenderType"="Transparent-1" }
      Pass {
         ZWrite Off
         Fog { Color (1, 1, 1) }
         AlphaTest Greater 0
         ColorMask RGB
         Blend DstColor Zero
         SetTexture [_ShadowTex] {
            combine texture,texture
            Matrix [_Projector]
         }
      }
   }
}

或者用Vertex&Fragment

Shader "Custom/Circle" {
  Properties {
     _ShadowTex ("Cookie"2D"" }
  }
  Subshader {
     pass {
        ZWrite off
        Blend DstColor One
       CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        sampler2D _ShadowTex;
        float4x4 _Projector;

        struct v2f {
            float4 pos:SV_POSITION;
            float4 texc:TEXCOORD0;
        };
        v2f vert(appdata_base v)
        {
            v2f o;
            o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
            o.texc=mul(_Projector,v.vertex);
            return o;
        }
        float4 frag(v2f i):COLOR
        {
            float4 c=tex2Dproj(_ShadowTex,i.texc);
            return c;
        }
        ENDCG
    }//endpass
  }
}

例1: 普通圆点阴影(blob shadow)

加在角色下面,记得把角色的layer加进 projector设置下的'Ignore Layer'即可。

http://s4/small/47113292td930b5a4acc3&690

Shader "Projector/Multiply" {
   Properties {
      _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }
      _FalloffTex ("FallOff", 2D) = "white" { TexGen ObjectLinear   }
   }

   Subshader {
      Tags { "RenderType"="Transparent-1" }
      Pass {
         ZWrite Off
         Fog { Color (1, 1, 1) }
         AlphaTest Greater 0
         ColorMask RGB
         Blend DstColor Zero
         Offset -1, -1
         SetTexture [_ShadowTex] {
            combine texture, ONE - texture
            Matrix [_Projector]
         }
         SetTexture [_FalloffTex] {
            constantColor (1,1,1,0)
            combine previous lerp (texture) constant
            Matrix [_ProjectorClip]
         }
      }
   }
}

2 伪动态阴影(Fake Dynamic shadow)

就是用3d Max或者 Maya或者Unity,先把动画对应的阴影烘焙好, 做成序列帧。然后用projector的材质做对应的帧动画即可。

3 光的投影

基本是就把黑的blob cookie换成 中间是白色的cookie即可。

4 投影仪(根据Meterial的贴图,可以是图片,视频,另一个相机看到的景象)

另一个相机绘制到RenderTexture,然后projector的材质使用RenderTexture即可

5 3D或者2D手电筒的效果

就是projector的方向和范围设置和手电一致。把电筒的光颜色投出去即可。


移动平台上的角色阴影制作

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有