質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

7332閲覧

shaderで処理したものにさらに処理する

shiroshiro_me

総合スコア19

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2018/10/15 07:09

移動平均化フィルタの処理を繰り返すことで平滑化の度合いを上げる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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

変数_Aveの宣言がCGPROGRAMENDCGの間に入っていないことによるエラーと思われます。
下記のような書き換えではどうでしょうか?

ShaderLab

1 2// 省略 3 4 GrabPass{ "_Ave" } 5 6 // sampler2D _Ave; // これを... 7 8 Pass 9 { 10 CGPROGRAM 11#pragma target 3.0 12#pragma vertex vert 13#pragma fragment frag 14 sampler2D _Ave; // ここに引っ越し 15 struct v2f 16 { 17 float4 pos : SV_POSITION; 18 19 float3 uv : TEXCOORD; 20 float4 screenPos : TEXCOORD1; 21 float3 ray : TEXCOORD2; 22 }; 23 24// 省略 25

繰り返しについては、確かにGrabPassを過剰に使うのは高コストでしょうが、3~4回程度なら十分現実的だろうと思います。実際にやってパフォーマンスを見てみて、回数を検討するのがいいでしょうね。

投稿2018/10/15 21:11

編集2018/10/15 21:48
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問