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

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

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

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

Q&A

解決済

1回答

1045閲覧

unityでemissionをnomalmapに反応させたい

makaomakao

総合スコア13

Unity

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

0グッド

0クリップ

投稿2019/03/18 07:25

編集2019/03/18 07:25

前提・実現したい事

gameobjectのlight群はしっかりnomalmapの凹凸に反応して光を反射するんですがemissionで発生させた光はとても平たくオブジェクトに写ってしまうのを近い表現に変えたいです。
根本的にemissionとlightは違うのは理解しているんですが、light関連を調べても行き詰まってしまったので質問しました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

独自のマテリアルを作って、発光強度に何らかの形で法線を関わらせることになりそうですね。
どのようにやるかはアイディア次第だと思いますが、例えば単純に接空間法線のZ成分を利用してみるのはどうでしょう。傾いた面がちょっと暗くなり、デコボコをアピールできるかと思います。

ShaderLab

1Shader "Custom/NormalDependentEmission" 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 [Header(Normal)] 11 [NoScaleOffset] _BumpMap ("Normal Map", 2D) = "bump" {} 12 _BumpScale ("Bump Scale", Range(0.0, 4.0)) = 1.0 13 14 [Header(Emission)] 15 [NoScaleOffset][HDR] _EmissionMap ("Emission", 2D) = "white" {} 16 [HDR] _EmissionColor ("Color", Color) = (0,0,0) 17 _EmissionExponent ("Exponent", Range(1.0, 256.0)) = 2.0 18 _EmissionBias ("Bias", Range(0.0, 1.0)) = 1.0 19 [Toggle] _EmissionInvert ("Invert", Float) = 1.0 20 } 21 SubShader 22 { 23 Tags { "RenderType"="Opaque" } 24 LOD 200 25 26 CGPROGRAM 27 // Physically based Standard lighting model, and enable shadows on all light types 28 #pragma surface surf Standard fullforwardshadows 29 30 // Use shader model 3.0 target, to get nicer looking lighting 31 #pragma target 3.0 32 33 struct Input 34 { 35 float2 uv_MainTex; 36 float3 viewDir; 37 }; 38 39 sampler2D _MainTex; 40 half _Glossiness; 41 half _Metallic; 42 fixed4 _Color; 43 sampler2D _BumpMap; 44 half _BumpScale; 45 sampler2D _EmissionMap; 46 half4 _EmissionColor; 47 float _EmissionExponent; 48 float _EmissionBias; 49 float _EmissionInvert; 50 51 // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. 52 // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. 53 // #pragma instancing_options assumeuniformscaling 54 UNITY_INSTANCING_BUFFER_START(Props) 55 // put more per-instance properties here 56 UNITY_INSTANCING_BUFFER_END(Props) 57 58 void surf(Input IN, inout SurfaceOutputStandard o) 59 { 60 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 61 half4 emission = tex2D(_EmissionMap, IN.uv_MainTex) * _EmissionColor; 62 float3 normal = UnpackNormalWithScale(tex2D(_BumpMap, IN.uv_MainTex), _BumpScale); 63 64 // モデル本来の面の向きを向いているときに最も強く発光するようにする 65 float intensity = saturate(normal.z); 66 67 // 反転トグルがオンの場合、逆に本来の向きに対して傾いた面を強く発光させる 68 intensity = _EmissionInvert + (1.0 - 2.0 * _EmissionInvert) * intensity; 69 70 // 適当に冪乗して鋭さを調節 71 intensity = pow(intensity, _EmissionExponent); 72 73 // バイアスに応じて明暗差を調節 74 intensity = lerp(1.0, intensity, _EmissionBias); 75 76 o.Albedo = c.rgb; 77 o.Normal = normal; 78 o.Metallic = _Metallic; 79 o.Smoothness = _Glossiness; 80 o.Alpha = c.a; 81 o.Emission = emission * intensity; 82 } 83 ENDCG 84 } 85 FallBack "Diffuse" 86}

Exponent 64、Bias 1、Invertオフの場合

結果1

他にも、ありきたりかもしれませんが視線と法線の内積を使ってみるのも面白いと思います。

ShaderLab

1Shader "Custom/NormalViewDirectionDependentEmission" 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 [Header(Normal)] 11 [NoScaleOffset] _BumpMap ("Normal Map", 2D) = "bump" {} 12 _BumpScale ("Bump Scale", Range(0.0, 4.0)) = 1.0 13 14 [Header(Emission)] 15 [NoScaleOffset][HDR] _EmissionMap ("Emission", 2D) = "white" {} 16 [HDR] _EmissionColor ("Color", Color) = (0,0,0) 17 _EmissionExponent ("Exponent", Range(1.0, 256.0)) = 2.0 18 _EmissionBias ("Bias", Range(0.0, 1.0)) = 1.0 19 [Toggle] _EmissionInvert ("Invert", Float) = 1.0 20 } 21 SubShader 22 { 23 Tags { "RenderType"="Opaque" } 24 LOD 200 25 26 CGPROGRAM 27 // Physically based Standard lighting model, and enable shadows on all light types 28 #pragma surface surf Standard fullforwardshadows 29 30 // Use shader model 3.0 target, to get nicer looking lighting 31 #pragma target 3.0 32 33 struct Input 34 { 35 float2 uv_MainTex; 36 float3 viewDir; 37 }; 38 39 sampler2D _MainTex; 40 half _Glossiness; 41 half _Metallic; 42 fixed4 _Color; 43 sampler2D _BumpMap; 44 half _BumpScale; 45 sampler2D _EmissionMap; 46 half4 _EmissionColor; 47 float _EmissionExponent; 48 float _EmissionBias; 49 float _EmissionInvert; 50 51 // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. 52 // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. 53 // #pragma instancing_options assumeuniformscaling 54 UNITY_INSTANCING_BUFFER_START(Props) 55 // put more per-instance properties here 56 UNITY_INSTANCING_BUFFER_END(Props) 57 58 void surf(Input IN, inout SurfaceOutputStandard o) 59 { 60 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 61 half4 emission = tex2D(_EmissionMap, IN.uv_MainTex) * _EmissionColor; 62 float3 normal = UnpackNormalWithScale(tex2D(_BumpMap, IN.uv_MainTex), _BumpScale); 63 64 // 視線と面が対向するとき最も強く発光するようにする 65 // 発光というよりも、むしろカメラにライトを取り付けて照らしているように見えるかもしれません 66 float intensity = saturate(dot(normalize(IN.viewDir), normal)); 67 68 // 反転トグルがオンの場合、逆に視線と直交する面を強く発光させる 69 // リムライティング効果とかフレネル反射に近いでしょうか 70 intensity = _EmissionInvert + (1.0 - 2.0 * _EmissionInvert) * intensity; 71 72 // 適当に冪乗して鋭さを調節 73 intensity = pow(intensity, _EmissionExponent); 74 75 // バイアスに応じて明暗差を調節 76 intensity = lerp(1.0, intensity, _EmissionBias); 77 78 o.Albedo = c.rgb; 79 o.Normal = normal; 80 o.Metallic = _Metallic; 81 o.Smoothness = _Glossiness; 82 o.Alpha = c.a; 83 o.Emission = emission * intensity; 84 } 85 ENDCG 86 } 87 FallBack "Diffuse" 88}

Exponent 16、Bias 1、Invertオフの場合

結果2

Exponent 2、Bias 1、Invertオンの場合

結果3

投稿2019/03/19 05:22

Bongo

総合スコア10809

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

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

makaomakao

2019/03/19 16:34

とても丁寧な回答ありがとうございます。視線と法線の内積を使ったパターンが理想に近いので試してみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問