Q&A
移動平均化フィルタの処理を繰り返すことで平滑化の度合いを上げるshaderプログラムを作りたいです。
https://qiita.com/yasuo_mc/items/67e5cf1d1f1c65535ae1
このサイトをもとに下に同じ処理を何度も書く方向で実装してみたのですが、
Shader error in 'RepeatAve2': Parse error: syntax error, unexpected TVAL_ID at line 99
というエラーが出て、実装できず困っています。TVAL_IDとはなんでしょうか。
また、最終的には3,4回ほど処理を繰り返してぼかしの様子を見てみたいと思っていますが、この方向性は現実的でしょうか。
shader
1Shader "Custom/RepeatAve2" { 2 Properties 3 { 4 _Color("Color", Color) = (1, 1, 1, 1) 5 6 _MainTex("Diffuse", 2D) = "white" {} 7 _Noise("Noise", 2D) = "black" {} 8 9 _Range("Range", Float) = 0.025 10 _Blur("Blur", Float) = 0.005 11 _Repeat("Repeat", int) = 1 12 _Size("Size", int) = 3 13 } 14 15 SubShader 16 { 17 Cull Off 18 19 GrabPass{ "_Frost" } 20 21 CGINCLUDE 22 #include "UnityCG.cginc" 23 24 half4 _Color; 25 26 sampler2D _MainTex; 27 float4 _MainTex_ST; 28 29 sampler2D _Frost; 30 sampler2D _Noise; 31 float4 _Noise_ST; 32 33 half _Range; 34 half _Blur; 35 36 int _Size; 37 int _Repeat; 38 39 ENDCG 40 41 Pass 42 { 43 CGPROGRAM 44 #pragma target 3.0 45 #pragma vertex vert 46 #pragma fragment frag 47 48 struct v2f 49 { 50 float4 pos : SV_POSITION; 51 52 float3 uv : TEXCOORD; 53 float4 screenPos : TEXCOORD1; 54 float3 ray : TEXCOORD2; 55 }; 56 57 v2f vert(appdata_full v) 58 { 59 v2f o; 60 o.pos = UnityObjectToClipPos(v.vertex); 61 o.uv = v.texcoord; 62 o.screenPos = ComputeScreenPos(o.pos); 63 o.ray = UnityObjectToViewPos(v.vertex).xyz * float3(-1, -1, 1); 64 return o; 65 } 66 67 half4 frag(v2f i) : SV_Target 68 { 69 i.ray = i.ray * (_ProjectionParams.z / i.ray.z); 70 float2 uv = i.screenPos.xy / i.screenPos.w; 71 72 float2 frostUV = tex2D(_Noise, i.uv * _Noise_ST.xy + _Noise_ST.zw).xy; 73 74 frostUV -= 0.5; 75 frostUV *= _Range; 76 frostUV += uv; 77 78 half4 frost = tex2D(_Frost, frostUV); 79 for (int m = -(_Size - 1) / 2; m <= (_Size - 1) / 2; m++) { 80 for (int n = -(_Size - 1) / 2; n <= (_Size - 1) / 2; n++) { 81 frost += tex2D(_Frost, frostUV + float2(_Blur * m, _Blur * n)); 82 } 83 } 84 85 frost /= _Size * _Size; 86 87 half4 diffuse = tex2D(_MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw); 88 89 half alpha = _Color.a * diffuse.a; 90 91 return half4(frost.xyz + (diffuse.rgb * _Color.rgb * alpha), 1); 92 } 93 94 ENDCG 95 } 96 97 GrabPass{ "_Ave" } 98 99 sampler2D _Ave; 100 101 Pass 102 { 103 CGPROGRAM 104#pragma target 3.0 105#pragma vertex vert 106#pragma fragment frag 107 108 struct v2f 109 { 110 float4 pos : SV_POSITION; 111 112 float3 uv : TEXCOORD; 113 float4 screenPos : TEXCOORD1; 114 float3 ray : TEXCOORD2; 115 }; 116 117 v2f vert(appdata_full v) 118 { 119 v2f o; 120 o.pos = UnityObjectToClipPos(v.vertex); 121 o.uv = v.texcoord; 122 o.screenPos = ComputeScreenPos(o.pos); 123 o.ray = UnityObjectToViewPos(v.vertex).xyz * float3(-1, -1, 1); 124 return o; 125 } 126 127 half4 frag(v2f i) : SV_Target 128 { 129 i.ray = i.ray * (_ProjectionParams.z / i.ray.z); 130 float2 uv = i.screenPos.xy / i.screenPos.w; 131 132 float2 frostUV = tex2D(_Noise, i.uv * _Noise_ST.xy + _Noise_ST.zw).xy; 133 134 frostUV -= 0.5; 135 frostUV *= _Range; 136 frostUV += uv; 137 138 half4 frost = tex2D(_Ave, frostUV); 139 for (int m = -(_Size - 1) / 2; m <= (_Size - 1) / 2; m++) { 140 for (int n = -(_Size - 1) / 2; n <= (_Size - 1) / 2; n++) { 141 frost += tex2D(_Ave, frostUV + float2(_Blur * m, _Blur * n)); 142 } 143 } 144 145 frost /= _Size * _Size; 146 147 half4 diffuse = tex2D(_MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw); 148 149 half alpha = _Color.a * diffuse.a; 150 151 return half4(frost.xyz + (diffuse.rgb * _Color.rgb * alpha), 1); 152 } 153 154 ENDCG 155 } 156 } 157 Fallback Off 158} 159
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。