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

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

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

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

Q&A

解決済

1回答

1050閲覧

オブジェトの影を出しつつ、ライトの影響を一定にしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2021/06/27 14:20

まず、以下の画像をご覧ください。これはunityでGameビューに表示されている同じオブジェクトでカメラの位置を少し変えたものです。
イメージ説明 イメージ説明

違いとして、1枚目の画像では左端に表示されている側面が明るく、2枚目はそれがなくなり、右の部分が少し明るくなっています。
画面上にはDirectional Lightが1個配置されており、カメラを動かすとオブジェクトから見たカメラの角度が変わるため、このように明るさに変化が出るものと思います。
オブジェクトに回り込んだり、近づいているなら、このような明るさの変化も自然なのかもしれません。

しかし、cameraがorthographicであることと、カメラの角度を変えたりしたわけではないので、オブジェクトの表示上のサイズが変わっていないにも関わらず、このように明るさが変わってしまうのは違和感が強く出てしまいます。

このオブジェクトのシェーダーをunlitにしたり、lightを消して環境光だけにすればこの問題は起きなくなりますが、同時に画像上にもある影も表示されなくなってしまいます。

オブジェトの影を出しつつ、ライトの影響を一定にするにはどうすればいいでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

おっしゃるとおり、カメラがOrthographicならカメラを平行移動しても視線の方向は一定のはずですから、ハイライトの入り方だとかはそのままで映像が平行移動するべきだろうと思います。
ご質問者さんのおっしゃる現象を発生させる方法がすぐには分からなかったのですが、どうやらマテリアルのSmoothnessを高くすると顕著になるようですね。

図1

私の試した限りではSmoothnessの低いマテリアルなら目立たなかったので、もし表現上問題なければSmoothnessを下げると改善するかもしれません。

視線計算がどうなっているのかと思って調べてみたところ、Standardライティングのサーフェイスシェーダーではワールド空間における視線の方向を...

ShaderLab

1float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));

という風に求めているようです。UnityCG.cgincによると、UnityWorldSpaceViewDirは...

ShaderLab

1// Computes world space view direction, from object space position 2inline float3 UnityWorldSpaceViewDir( in float3 worldPos ) 3{ 4 return _WorldSpaceCameraPos.xyz - worldPos; 5}

となっており、どうもPerspectiveしか想定していないように見えます。
同じく、Standardシェーダーでも...

ShaderLab

1o.eyeVec.xyz = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);

となっており、やはり注目点のワールド座標とカメラのワールド座標から算出していて、Perspective前提であるように思われます。
そこで、下記のようなサーフェイスシェーダーならどうなるかと思って試してみたところ...

ShaderLab

1Shader "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}

ちょっと試した限りでは、カメラ移動によってハイライトの入り方が変わることはなくなったように見えました。

図2

投稿2021/06/27 21:14

Bongo

総合スコア10811

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

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

退会済みユーザー

退会済みユーザー

2021/06/28 17:07

Smoothnessの値を確認したところすでに0でしたので、記述いただいたshaderを導入したところ、解決することができました。 shaderの中身については半分も理解できておりませんが、少しつずつ確認していこうと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問