Unityで作った水の屈折っぽいものをAndroidに表示させたいのですが、プラットフォームを変更したら見た目が変わってしまいました。
どうにかしてPCのものをそのまま見れるようにしたいのですがどうすればいいかわかりません
左がプラットフォームがPC、右がAndroidのものです。
水の部分のShaderは下のコードです。
ShaderLab
1Shader "Custom/refract" 2{ 3 Properties 4 { 5 _Color("Color", Color) = (0.8, 0.5, 0.5, 0.1) 6 _MainTex("Albedo (RGB)", 2D) = "white" {} 7 _Glossiness("Smoothness", Range(0,1)) = 0.5 8 _Metallic("Metallic", Range(0,1)) = 0.0 9 _Refraction("Refraction Index", Range(1.0, 3.0)) = 1.33 10 _Distance("Refraction Distance", Float) = 10.0 11 } 12 SubShader 13 { 14 Tags { "Queue" = "Transparent" "RenderType" = "Transparent" } 15 16 GrabPass {} 17 18 CGPROGRAM 19 #pragma surface surf Standard alpha 20 #pragma target 3.0 21 22 sampler2D _MainTex; 23 sampler2D _GrabTexture; 24 sampler2D _CameraDepthTexture; 25 26 struct Input 27 { 28 float2 uv_MainTex; 29 float3 worldPos; 30 float3 worldNormal; 31 }; 32 33 half _Glossiness; 34 half _Metallic; 35 fixed4 _Color; 36 float _Refraction; 37 float _Distance; 38 39 void surf(Input IN, inout SurfaceOutputStandard o) 40 { 41 #define DISTANCE_DIVISOR 16.0 42 #define ITERATION_COUNT 32 43 #define DEPTH_THRESHOLD 0.1 44 #define EDGE_BLENDING_EXPONENT 4.0 45 46 // まず屈折方向を求め... 47 float3 eyeDir = normalize(IN.worldPos - _WorldSpaceCameraPos); 48 float3 refractionDir = refract(eyeDir, normalize(IN.worldNormal), 1.0 / _Refraction); 49 50 // 透明物体の表面を起点に、少しずつ屈折方向へ進みながら 51 // デプスをチェックしていき、他のオブジェクトと衝突する点を求める 52 float stride = _Distance / DISTANCE_DIVISOR; 53 float s = 1.0; 54 float4 refractionPos = float4(IN.worldPos, 1.0); 55 float4 refractionViewPos; 56 float4 refractionClipPos; 57 float backgroundDepth; 58 float hit = 0.0; 59 for (int i = 0; i < ITERATION_COUNT; i++) 60 { 61 refractionPos.xyz += s * stride * refractionDir; 62 refractionViewPos = mul(UNITY_MATRIX_V, refractionPos); 63 refractionClipPos = mul(UNITY_MATRIX_P, refractionViewPos); 64 backgroundDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, ComputeScreenPos(refractionClipPos))); 65 if (s * (backgroundDepth + refractionViewPos.z) < 0.0) 66 { 67 // もし衝突が検出されたら、進行方向を逆転させ 68 // 進行スピードを半減させて衝突しなくなるまで戻る 69 // 衝突しなくなったら再び進行方向逆転・スピード半減...を繰り返し 70 // なるべく正確な接触位置を求める 71 hit = 1.0; 72 s *= -1.0; 73 stride *= 0.5; 74 } 75 } 76 77 // このようなデプスだけを頼りにした衝突判定では、画面内のオブジェクトが奥行き方向に 78 // どれだけの厚みを持っているかわからないので、本来であればオブジェクトの背後を 79 // 素通りしていくべき屈折光経路まで衝突していると判定されてしまうことになる 80 // しょうがないので「衝突している」と判定されたとしても、オブジェクトのデプスと 81 // 検出された衝突点のデプスがある程度ずれているようなら誤検出と見なして検出を取り消す 82 // また、判定境界の部分に発生するノイズを軽減するため、境界付近では判定値をなめらかに変える 83 float depthDelta = abs(backgroundDepth + refractionViewPos.z); 84 hit = hit * saturate(1.0 - pow(depthDelta / DEPTH_THRESHOLD, EDGE_BLENDING_EXPONENT)); 85 86 // 衝突していると判定された場合はグラブテクスチャの色を、そうでなければ 87 // リフレクション用キューブマップの色を屈折色として採用する 88 float4 grabTexColor = tex2Dproj(_GrabTexture, ComputeGrabScreenPos(refractionClipPos)); 89 float4 backgroundColor = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, refractionDir); 90 float4 refractionColor = lerp(backgroundColor, grabTexColor, hit); 91 fixed4 surfaceColor = tex2D(_MainTex, IN.uv_MainTex) * _Color; 92 93 o.Albedo = surfaceColor.rgb * surfaceColor.a; 94 o.Metallic = _Metallic; 95 o.Smoothness = _Glossiness; 96 o.Alpha = 1.0; 97 o.Emission = refractionColor.rgb * surfaceColor.rgb * (1.0 - surfaceColor.a); 98 } 99 ENDCG 100 } 101}
どうか解決法を教えていただけるとありがたいです。よろしくお願いします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。