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

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

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

Q&A

解決済

1回答

2415閲覧

[Unity] Shader Graphで光の当たる部分を表示して影の部分が透明になるオブジェクトを作成したい

ruby_begginer

総合スコア7

0グッド

0クリップ

投稿2022/04/24 00:39

Shader Graphでライト(懐中電灯など)を当てると、光の当たる部分だけ浮かび上がるオブジェクトを作成したいと思っています。

Blenderでは下図のように再現できるのですが、これをUnityでも再現したいと思っています。

イメージ説明

構想としては、光が強く当たる部分を1として影を0にしてAlphaに入れればいいと思っているのですが、光量の取得の仕方が分からない状態です。

CustomFunctionでメインライトを取得する方法が紹介されていたのですが、これだとDirectionLightの光にしか反応せず、スポットライトのような光に反応しなくて困っています。

#ifdef SHADERGRAPH_PREVIEW Direction = half3(0.5, 0.5, 0); Color = 1; #else Light light = GetMainLight(); Direction = light.direction; Color = light.color; #endif

Shader Graphで光の当たる部分だけ浮かび上がり、影の部分は透明なオブジェクトを作成したいと思っています。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

メインライトだけでなく追加ライトも考慮する必要があるでしょうね。
下記のように改変してみましたがいかがでしょうか。ちょっと仕様を変更し、ワールド座標とワールド法線を受け取って照明強度を返すような作りに変更しました。

HLSL

1#ifdef SHADERGRAPH_PREVIEW 2 Attenuation = 1.0; 3#else 4 Light light = GetMainLight(TransformWorldToShadowCoord(WorldPosition)); 5 float lightIntensity = max(max(light.color.r, light.color.g), light.color.b); 6 Attenuation = saturate(dot(light.direction, WorldNormal)) * lightIntensity * light.shadowAttenuation; 7 int lightCount = GetAdditionalLightsCount(); 8 for (int i = 0; i < lightCount; i++) 9 { 10 light = GetAdditionalLight(i, WorldPosition, unity_ProbesOcclusion); 11 lightIntensity = max(max(light.color.r, light.color.g), light.color.b); 12 Attenuation += lightIntensity * light.distanceAttenuation * light.shadowAttenuation * saturate(dot(light.direction, WorldNormal)); 13 } 14 Attenuation = saturate(Attenuation); 15#endif

Custom Functionノードはに入力としてWorldPositionWorldNormalを、出力としてAttenuationを用意しました。
そしてWorldPositionWorldNormalにそれぞれワールド座標・ワールド法線を接続し、出力されたAttenuationAlphaに接続しています。

図1

図2

投稿2022/04/24 06:09

Bongo

総合スコア10807

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

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

ruby_begginer

2022/04/24 14:24

3日ほどあれこれと悩んでましたが、おかげで再現することができました! 本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問