おっしゃるとおり、カメラがOrthographicならカメラを平行移動しても視線の方向は一定のはずですから、ハイライトの入り方だとかはそのままで映像が平行移動するべきだろうと思います。
ご質問者さんのおっしゃる現象を発生させる方法がすぐには分からなかったのですが、どうやらマテリアルのSmoothnessを高くすると顕著になるようですね。
私の試した限りではSmoothnessの低いマテリアルなら目立たなかったので、もし表現上問題なければSmoothnessを下げると改善するかもしれません。
視線計算がどうなっているのかと思って調べてみたところ、Standardライティングのサーフェイスシェーダーではワールド空間における視線の方向を...
ShaderLab
1 float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
という風に求めているようです。UnityCG.cgincによると、UnityWorldSpaceViewDir
は...
ShaderLab
1 // Computes world space view direction, from object space position
2 inline float3 UnityWorldSpaceViewDir( in float3 worldPos )
3 {
4 return _WorldSpaceCameraPos.xyz - worldPos;
5 }
となっており、どうもPerspectiveしか想定していないように見えます。
同じく、Standardシェーダーでも...
ShaderLab
1 o.eyeVec.xyz = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
となっており、やはり注目点のワールド座標とカメラのワールド座標から算出していて、Perspective前提であるように思われます。
そこで、下記のようなサーフェイスシェーダーならどうなるかと思って試してみたところ...
ShaderLab
1 Shader "Custom/Standard (Orthographic)"
2 {
3 Properties
4 {
5 _Color ("Color", Color) = (1,1,1,1)
6 _MainTex ("Albedo (RGB)", 2D) = "white" {}
7 _Glossiness ("Smoothness", Range(0,1)) = 0.5
8 _Metallic ("Metallic", Range(0,1)) = 0.0
9 }
10
11 SubShader
12 {
13 Tags { "RenderType"="Opaque" }
14 LOD 200
15
16 CGPROGRAM
17
18 // デフォルトのStandardライティングに代わって、カスタムライティングを行う
19 #pragma surface surf StandardOrthographic fullforwardshadows
20 #pragma target 3.0
21
22 // カスタムライティングといっても、単にOrthographicならviewDirをカメラのforwardに置き換えるだけで
23 // 主要処理はStandardライティングに任せる
24 #include "UnityPBSLighting.cginc"
25
26 inline float3 getViewDir(in float3 worldViewDir)
27 {
28 return any(UNITY_MATRIX_P._41_42_43) ? worldViewDir : -UNITY_MATRIX_V._31_32_33;
29 }
30
31 inline half4 LightingStandardOrthographic(SurfaceOutputStandard s, float3 viewDir, UnityGI gi)
32 {
33 return LightingStandard(s, getViewDir(viewDir), gi);
34 }
35
36 inline half4 LightingStandardOrthographic_Deferred(SurfaceOutputStandard s, float3 viewDir, UnityGI gi, out half4 outGBuffer0, out half4 outGBuffer1, out half4 outGBuffer2)
37 {
38 return LightingStandard_Deferred(s, getViewDir(viewDir), gi, outGBuffer0, outGBuffer1, outGBuffer2);
39 }
40
41 inline void LightingStandardOrthographic_GI(SurfaceOutputStandard s, UnityGIInput data, inout UnityGI gi)
42 {
43 LightingStandard_GI(s, data, gi);
44 }
45
46 // 以降は普通のサーフェイスシェーダーと同様に記述する
47
48 sampler2D _MainTex;
49
50 struct Input
51 {
52 float2 uv_MainTex;
53 };
54
55 half _Glossiness;
56 half _Metallic;
57 fixed4 _Color;
58
59 UNITY_INSTANCING_BUFFER_START(Props)
60 UNITY_INSTANCING_BUFFER_END(Props)
61
62 void surf(Input IN, inout SurfaceOutputStandard o)
63 {
64 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
65 o.Albedo = c.rgb;
66 o.Metallic = _Metallic;
67 o.Smoothness = _Glossiness;
68 o.Alpha = c.a;
69 }
70 ENDCG
71 }
72 FallBack "Diffuse"
73 }
ちょっと試した限りでは、カメラ移動によってハイライトの入り方が変わることはなくなったように見えました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/06/28 17:07