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

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

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

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

Q&A

0回答

943閲覧

HMD上でblurの消失

shiroshiro_me

総合スコア19

Unity

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

0グッド

0クリップ

投稿2018/10/05 04:13

編集2022/01/12 10:55

unityのshaderでガウシアンブラーを実装しました。
しかし、通常のMain cameraでは上手く機能していたのですが、HMD上で再生を行うと、再生前は適用されていたブラーが再生後消失するという事態に陥りました。Rangeに関係するノイズ処理はHMD上でも再生後うまく機能しますがブラーはなくなってしまいます。
使用しているHMDはFOVE0です。FOVE公式サイトで配布されているFove RigというprefabをヒエラルキーにインポートすることでFOVE0上でのプロジェクト再生が可能になっています。
FOVE公式のコミュニティフォーラムでも私の状況によく似た投稿がなされていました。
https://support.getfove.com/hc/en-us/community/posts/360014764273-Shader-not-working-Unity-3D-

どのような原因が考えられるでしょうか。以下の"Custom/Gaussian"が問題のソースコードです。
"Custom/Frost"はガウシアンフィルタに変更前のプログラムでこちらはHMD上でも機能したものになります。"Custom/Frost"から"Custom/Gaussian"へ書き換え後、今回の問題が起こりました。

"Custom/Gaussian"のマテリアルを適用したオブジェクトを複数個置くとフレームレートの低下が観測できたため、計算は行われているがHMDではレンダリングがなされていないものと考えられます。
計算コストを改善してもブラーは消失したままでした。
ノイズ処理は機能するので原因は95行目以下にあると思われますが、やはり原因は分かりません。

shader

1Shader "Custom/Gaussian" 2{ 3 Properties 4 { 5 _Color("Color", Color) = (1, 1, 1, 1) 6 7 _MainTex("Diffuse", 2D) = "white" {} 8 _Noise("Noise", 2D) = "black" {} 9 10 _Range("Range", Float) = 0.025 11 _Sigma("Sigma", Range(0.01, 8.0)) = 1.0 12 } 13 14 SubShader 15 { 16 //Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" } 17 18 Cull Off 19 20 GrabPass{ "_Frost" } 21 22 CGINCLUDE 23 #include "UnityCG.cginc" 24 25 half4 _Color; 26 27 sampler2D _MainTex; 28 float4 _MainTex_ST; 29 30 sampler2D _Frost; 31 float4 _Frost_TexelSize; 32 33 sampler2D _Noise; 34 float4 _Noise_ST; 35 36 half _Range; 37 float _Sigma; 38 39 // 重み計算用関数 40 inline float getWeight(float2 xy) 41 { 42 return exp(-dot(xy, xy) / (2.0 * _Sigma * _Sigma)); 43 } 44 45 // カーネルサイズ計算用関数 46 inline int getKernelN() 47 { 48 return (int)ceil(_Sigma * sqrt(-log(0.0001))); 49 } 50 51 // 最大kernelN...(int)ceil(8 * sqrt(-ln(0.0001))) 52 #define KERNEL_N_MAX 25 53 54 ENDCG 55 56 Pass 57 { 58 CGPROGRAM 59 #pragma target 3.0 60 #pragma vertex vert 61 #pragma fragment frag 62 63 struct v2f 64 { 65 float4 pos : SV_POSITION; 66 67 float3 uv : TEXCOORD; 68 float4 screenPos : TEXCOORD1; 69 float3 ray : TEXCOORD2; 70 }; 71 72 v2f vert(appdata_full v) 73 { 74 v2f o; 75 o.pos = UnityObjectToClipPos(v.vertex); 76 o.uv = v.texcoord; 77 o.screenPos = ComputeGrabScreenPos(o.pos); 78 o.ray = UnityObjectToViewPos(v.vertex).xyz * float3(-1, -1, 1); 79 return o; 80 } 81 82 half4 frag(v2f i) : SV_Target 83 { 84 i.ray = i.ray * (_ProjectionParams.z / i.ray.z); 85 86 float2 uv = i.screenPos.xy / i.screenPos.w; 87 88 float2 frostUV = tex2D(_Noise, i.uv * _Noise_ST.xy + _Noise_ST.zw).xy; 89 90 frostUV -= 0.5; 91 frostUV *= _Range; 92 frostUV += uv; 93 // frostUV = uv; 94 95 int kernelN = getKernelN(); 96 97 // ループ展開版 98 float2 texelOffset = float2(0, 0); 99 float weight = getWeight(texelOffset); 100 float weightSum = weight; 101 float4 frost = weight * tex2D(_Frost, frostUV); 102 103 [unroll(KERNEL_N_MAX)] 104 for (int n = 0; n < kernelN; n++) 105 { 106 int x = n + 1; 107 108 texelOffset = float2(x, 0); 109 weight = getWeight(texelOffset); 110 weightSum += 2 * weight; 111 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 112 texelOffset = float2(-x, 0); 113 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 114 } 115 116 [unroll(KERNEL_N_MAX)] 117 for (int m = 0; m < kernelN; m++) 118 { 119 int y = m + 1; 120 121 texelOffset = float2(0, y); 122 weight = getWeight(texelOffset); 123 weightSum += 2 * weight; 124 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 125 texelOffset = float2(0, -y); 126 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 127 128 [unroll(KERNEL_N_MAX)] 129 for (int n = 0; n < kernelN; n++) 130 { 131 int x = n + 1; 132 133 texelOffset = float2(x, y); 134 weight = getWeight(texelOffset); 135 weightSum += 4 * weight; 136 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 137 texelOffset = float2(-x, y); 138 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 139 texelOffset = float2(x, -y); 140 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 141 texelOffset = float2(-x, -y); 142 frost += weight * tex2D(_Frost, frostUV + texelOffset * _Frost_TexelSize.xy); 143 } 144 } 145 146 frost /= weightSum; 147 148 half4 diffuse = tex2D(_MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw); 149 150 half alpha = _Color.a * diffuse.a; 151 152 return half4(frost.xyz + (diffuse.rgb * _Color.rgb * alpha), 1); 153 } 154 155 ENDCG 156 } 157 } 158 159 Fallback Off 160}

shader

1Shader "Custom/Frost" 2{ 3 Properties 4 { 5 _Color("Color", Color) = (1, 1, 1, 1) 6 7 _MainTex("Diffuse", 2D) = "white" {} 8 _Noise("Noise", 2D) = "black" {} 9 10 _Range("Range", Float) = 0.025 11 _Blur("Blur", Float) = 0.005 12 } 13 14 SubShader 15 { 16 Cull Off 17 18 GrabPass{ "_Frost" } 19 20 CGINCLUDE 21 #include "UnityCG.cginc" 22 23 half4 _Color; 24 25 sampler2D _MainTex; 26 float4 _MainTex_ST; 27 28 sampler2D _Frost; 29 sampler2D _Noise; 30 float4 _Noise_ST; 31 32 half _Range; 33 half _Blur; 34 35 ENDCG 36 37 Pass 38 { 39 CGPROGRAM 40 #pragma target 3.0 41 #pragma vertex vert 42 #pragma fragment frag 43 44 struct v2f 45 { 46 float4 pos : SV_POSITION; 47 48 float3 uv : TEXCOORD; 49 float4 screenPos : TEXCOORD1; 50 float3 ray : TEXCOORD2; 51 }; 52 53 v2f vert(appdata_full v) 54 { 55 v2f o; 56 o.pos = UnityObjectToClipPos(v.vertex); 57 o.uv = v.texcoord; 58 o.screenPos = ComputeScreenPos(o.pos); 59 o.ray = UnityObjectToViewPos(v.vertex).xyz * float3(-1, -1, 1); 60 return o; 61 } 62 63 half4 frag(v2f i) : SV_Target 64 { 65 i.ray = i.ray * (_ProjectionParams.z / i.ray.z); 66 float2 uv = i.screenPos.xy / i.screenPos.w; 67 68 float2 frostUV = tex2D(_Noise, i.uv * _Noise_ST.xy + _Noise_ST.zw).xy; 69 70 frostUV -= 0.5; 71 frostUV *= _Range; 72 frostUV += uv; 73 74 half4 frost = 4 * tex2D(_Frost, frostUV); 75 frost += tex2D(_Frost, frostUV + float2(_Blur, _Blur)); 76 frost += 2 * tex2D(_Frost, frostUV + float2(_Blur, 0)); 77 frost += tex2D(_Frost, frostUV + float2(_Blur, -_Blur)); 78 frost += 2 * tex2D(_Frost, frostUV + float2(0, _Blur)); 79 frost += 2 * tex2D(_Frost, frostUV + float2(0, -_Blur)); 80 frost += tex2D(_Frost, frostUV + float2(-_Blur, _Blur)); 81 frost += 2 * tex2D(_Frost, frostUV + float2(-_Blur, 0)); 82 frost += tex2D(_Frost, frostUV + float2(-_Blur, -_Blur)); 83 frost *= 0.0625; 84 85 half4 diffuse = tex2D(_MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw); 86 87 half alpha = _Color.a * diffuse.a; 88 89 return half4(frost.xyz + (diffuse.rgb * _Color.rgb * alpha), 1); 90 } 91 92 ENDCG 93 } 94 } 95 96 Fallback Off 97} 98

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問