マテリアルの「Cookie」テクスチャと対応するプロパティ名は_MainTex
ではなく_ShadowTex
ですので、mainTexture ではセットできなかったものと思われます。
代わりにSetTexture を使ってみてはいかがでしょうか。
C#
1 using System . Collections ;
2 using System . Collections . Generic ;
3 using UnityEngine ;
4
5 public class WebCam : MonoBehaviour
6 {
7 public int Width = 1920 ;
8 public int Height = 1080 ;
9 public int FPS = 30 ;
10 public WebCamTexture webcamTexture ;
11 public Color32 [ ] color32 ;
12
13 void Start ( )
14 {
15 WebCamDevice [ ] devices = WebCamTexture . devices ;
16 webcamTexture = new WebCamTexture ( devices [ 0 ] . name , Width , Height , FPS ) ;
17 GetComponent < Projector > ( ) . material . SetTexture ( "_ShadowTex" , webcamTexture ) ;
18 webcamTexture . Play ( ) ;
19 }
20
21 void Update ( )
22 {
23 if ( Input . GetKeyDown ( KeyCode . Space ) || Input . touchCount > 0 )
24 {
25 color32 = webcamTexture . GetPixels32 ( ) ;
26 Texture2D texture = new Texture2D ( webcamTexture . width , webcamTexture . height ) ;
27 this . GetComponent < Projector > ( ) . material . SetTexture ( "_ShadowTex" , texture ) ;
28 texture . SetPixels32 ( color32 ) ;
29
30 texture . Apply ( ) ;
31 }
32 }
33 }
追記
外周部が引き延ばされる現象を防止する措置を加えてみました。
ShaderLab
1 Shader "Projector/LightClipped" {
2 Properties {
3 _Color ("Main Color", Color) = (1,1,1,1)
4 _ShadowTex ("Cookie", 2D) = "" {}
5 _FalloffTex ("FallOff", 2D) = "" {}
6 }
7
8 Subshader {
9 Tags {"Queue"="Transparent"}
10 Pass {
11 ZWrite Off
12 ColorMask RGB
13 Blend DstColor One
14 Offset -1, -1
15
16 CGPROGRAM
17 #pragma vertex vert
18 #pragma fragment frag
19 #pragma multi_compile_fog
20 #include "UnityCG.cginc"
21
22 struct v2f {
23 float4 uvShadow : TEXCOORD0;
24 float4 uvFalloff : TEXCOORD1;
25 UNITY_FOG_COORDS(2)
26 float4 pos : SV_POSITION;
27 };
28
29 float4x4 unity_Projector;
30 float4x4 unity_ProjectorClip;
31
32 v2f vert (float4 vertex : POSITION)
33 {
34 v2f o;
35 o.pos = UnityObjectToClipPos(vertex);
36 o.uvShadow = mul (unity_Projector, vertex);
37 o.uvFalloff = mul (unity_ProjectorClip, vertex);
38 UNITY_TRANSFER_FOG(o,o.pos);
39 return o;
40 }
41
42 fixed4 _Color;
43 sampler2D _ShadowTex;
44 sampler2D _FalloffTex;
45
46 fixed4 frag (v2f i) : SV_Target
47 {
48 // まずuvShadowをプロジェクション座標に直し...
49 float4 projCoord = UNITY_PROJ_COORD(i.uvShadow);
50
51 // 元のコードでは同次座標形式のままtex2Dprojでテクスチャサンプリングしているが、
52 // 代わりに事前にwで割ってしまい...
53 projCoord /= projCoord.w;
54
55 // 得られたUV座標を0~1にクランプ、さらにクランプ前の座標の絶対値を引くと
56 // 結果は座標が0~1の範囲内であれば0、範囲を外れていればマイナスになるはずなので
57 // これをclipに渡せば、値がマイナスのフラグメントは破棄される
58 clip(clamp(projCoord.xy, 0.0, 1.0) - abs(projCoord.xy));
59
60 // _ShadowTexからテクスチャサンプリングを行う
61 // projCoordはw除算済みなので、tex2Dprojの代わりにtex2Dを使う
62 fixed4 texS = tex2D (_ShadowTex, projCoord.xy);
63
64 texS.rgb *= _Color.rgb;
65 texS.a = 1.0-texS.a;
66
67 fixed4 texF = tex2Dproj (_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
68 fixed4 res = texS * texF.a;
69
70 UNITY_APPLY_FOG_COLOR(i.fogCoord, res, fixed4(0,0,0,0));
71 return res;
72 }
73 ENDCG
74 }
75 }
76 }
もし色合成方法を通常のUnlitシェーダー風にする場合、下記のようにしてみてはどうでしょうか。
ShaderLab
1 Shader "Projector/UnlitClipped" {
2 Properties {
3 _Color ("Main Color", Color) = (1,1,1,1)
4 _ShadowTex ("Cookie", 2D) = "white" {}
5 _FalloffTex ("FallOff", 2D) = "white" {}
6 }
7
8 Subshader {
9 Tags {"Queue"="Transparent"}
10 Pass {
11 ZWrite Off
12
13 // 合成方法を一般的なアルファブレンディングに変更
14 // カラーマスクも指定せず、アルファチャンネルへも通常通り書き込むようにする
15 Blend SrcAlpha OneMinusSrcAlpha
16
17 Offset -1, -1
18
19 CGPROGRAM
20 #pragma vertex vert
21 #pragma fragment frag
22 #pragma multi_compile_fog
23 #include "UnityCG.cginc"
24
25 struct v2f {
26 float4 uvShadow : TEXCOORD0;
27 float4 uvFalloff : TEXCOORD1;
28 UNITY_FOG_COORDS(2)
29 float4 pos : SV_POSITION;
30 };
31
32 float4x4 unity_Projector;
33 float4x4 unity_ProjectorClip;
34
35 v2f vert (float4 vertex : POSITION)
36 {
37 v2f o;
38 o.pos = UnityObjectToClipPos(vertex);
39 o.uvShadow = mul (unity_Projector, vertex);
40 o.uvFalloff = mul (unity_ProjectorClip, vertex);
41 UNITY_TRANSFER_FOG(o,o.pos);
42 return o;
43 }
44
45 fixed4 _Color;
46 sampler2D _ShadowTex;
47 sampler2D _FalloffTex;
48
49 fixed4 frag (v2f i) : SV_Target
50 {
51 // _ShadowTexのサンプリングはLightClippedと同様に行い...
52 float4 projCoord = UNITY_PROJ_COORD(i.uvShadow);
53 projCoord /= projCoord.w;
54 clip(clamp(projCoord.xy, 0.0, 1.0) - abs(projCoord.xy));
55 fixed4 texS = tex2D (_ShadowTex, projCoord.xy);
56
57 // 以降の色合成は通常のUnlitシェーダーと同様に
58 // 普通のアルファブレンディングを前提としたスタイルに変える
59 texS *= _Color;
60 fixed4 texF = tex2Dproj (_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
61 fixed4 res = texS * fixed4(1.0, 1.0, 1.0, texF.a);
62 UNITY_APPLY_FOG(i.fogCoord, res);
63 return res;
64 }
65 ENDCG
66 }
67 }
68 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/04 07:25
2019/11/04 09:03
2019/11/08 17:44
2019/11/08 19:45
2019/11/09 06:31