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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

1885閲覧

skyboxのshaderをSkybox/Proceduralにして,Directional lightを回転させて昼夜を表現してるのですが夜の時skyboxが完全に真っ暗になるのですが青色にしたい

hosituka

総合スコア15

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/07/19 14:42

編集2021/07/20 10:32

skyboxのshaderをSkybox/ProceduralにしてDirectional lightを回転させて昼夜を表現してるのですが夜の時skyboxが完全に真っ暗になるのですが青色にしたいです誰か意見をくださるとありがたいです。

一応朝の時も載せておきます
イメージ説明

こっちが本題の夜の時、空を黒じゃなくて青色にしたい
イメージ説明
そのSkyboxのshaderの設定

[イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

Proceduralをカスタマイズして、空の光を上乗せしてやるのはどうでしょうか。
ダウンロードアーカイブからビルトインシェーダーをダウンロードして、「DefaultResourcesExtra」フォルダ内の「Skybox-Procedural.shader」を複製して別名を付けたものをプロジェクトにインポートし、下記のような変更を加えたところ...

ShaderLab

1// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt) 2 3// シェーダー名を変えて、元のProceduralと区別が付くようにする 4Shader "Skybox/Procedural (Additional Skylight)" { 5Properties { 6 [KeywordEnum(None, Simple, High Quality)] _SunDisk ("Sun", Int) = 2 7 _SunSize ("Sun Size", Range(0,1)) = 0.04 8 _SunSizeConvergence("Sun Size Convergence", Range(1,10)) = 5 9 10 _AtmosphereThickness ("Atmosphere Thickness", Range(0,5)) = 1.0 11 _SkyTint ("Sky Tint", Color) = (.5, .5, .5, 1) 12 _GroundColor ("Ground", Color) = (.369, .349, .341, 1) 13 14 _Exposure("Exposure", Range(0, 8)) = 1.3 15 16 // 上乗せする光を表すプロパティを追加する 17 [Header(Additional Skylight)] 18 [HDR] _Skylight ("Sky", Color) = (0.0, 0.25, 0.5, 1.0) 19 [HDR] _Equatorlight ("Equator", Color) = (0.0, 0.0, 0.125, 1.0) 20 [HDR] _Groundlight ("Ground", Color) = (0.0, 0.0, 0.0, 1.0) 21} 22 23SubShader { 24 Tags { "Queue"="Background" "RenderType"="Background" "PreviewType"="Skybox" } 25 Cull Off ZWrite Off 26 27 Pass { 28 29 CGPROGRAM 30 31 // (ここにすごく長い光計算コードが続きますが、そこは全部読み飛ばしてfragの直前まで省略しました) 32 33 // 追加したプロパティと対応するユニフォーム変数を追加し... 34 half3 _Skylight; 35 half3 _Equatorlight; 36 half3 _Groundlight; 37 38 half4 frag (v2f IN) : SV_Target 39 { 40 half3 col = half3(0.0, 0.0, 0.0); 41 42 // if y > 1 [eyeRay.y < -SKY_GROUND_THRESHOLD] - ground 43 // if y >= 0 and < 1 [eyeRay.y <= 0 and > -SKY_GROUND_THRESHOLD] - horizon 44 // if y < 0 [eyeRay.y > 0] - sky 45 #if SKYBOX_SUNDISK == SKYBOX_SUNDISK_HQ 46 half3 ray = normalize(IN.vertex.xyz); 47 half y = ray.y / SKY_GROUND_THRESHOLD; 48 #elif SKYBOX_SUNDISK == SKYBOX_SUNDISK_SIMPLE 49 half3 ray = IN.rayDir.xyz; 50 half y = ray.y / SKY_GROUND_THRESHOLD; 51 #else 52 half y = IN.skyGroundFactor; 53 #endif 54 55 // if we did precalculate color in vprog: just do lerp between them 56 col = lerp(IN.skyColor, IN.groundColor, saturate(y)); 57 58 #if SKYBOX_SUNDISK != SKYBOX_SUNDISK_NONE 59 if(y < 0.0) 60 { 61 col += IN.sunColor * calcSunAttenuation(_WorldSpaceLightPos0.xyz, -ray); 62 } 63 #endif 64 65 // この位置で光の上乗せを行う 66 half h = y * SKY_GROUND_THRESHOLD; 67 col += lerp(0.0, _Skylight, saturate(-h)); 68 col += lerp(0.0, _Equatorlight, saturate(1.0 - abs(h))); 69 col += lerp(0.0, _Groundlight, saturate(h)); 70 71 #if defined(UNITY_COLORSPACE_GAMMA) && !SKYBOX_COLOR_IN_TARGET_COLOR_SPACE 72 col = LINEAR_2_OUTPUT(col); 73 #endif 74 75 return half4(col,1.0); 76 77 } 78 ENDCG 79 } 80} 81 82 83Fallback Off 84CustomEditor "SkyboxProceduralShaderGUI" 85}

下図のように、真夜中でも青っぽい雰囲気になりました。

図

夜中だけ上乗せを行う場合

先のコードで書き足した場所のうち、プロパティ宣言部は

ShaderLab

1 // 上乗せする色を表すプロパティを追加する 2 [Header(Additional Skylight)] 3 [HDR] _Skylight ("Sky", Color) = (0.0, 0.25, 0.5, 1.0) 4 [HDR] _Equatorlight ("Equator", Color) = (0.0, 0.0, 0.125, 1.0) 5 [HDR] _Groundlight ("Ground", Color) = (0.0, 0.0, 0.0, 1.0) 6 [Toggle] _NighttimeOnly ("Nighttime Only", Float) = 1.0 7 _TwilightAngle ("Twilight Angle", Range(-90.0, 90.0)) = -10.0 8 _TwilightRange ("Twilight Range", Range(0.0, 180.0)) = 5.0

ユニフォーム変数宣言部は

ShaderLab

1 // 追加したプロパティと対応するユニフォーム変数を追加し... 2 half3 _Skylight; 3 half3 _Equatorlight; 4 half3 _Groundlight; 5 half _NighttimeOnly; 6 half _TwilightAngle; 7 half _TwilightRange;

上乗せ処理部は

ShaderLab

1 // この位置で色の上乗せを行う 2 half h = y * SKY_GROUND_THRESHOLD; 3 half3 additionalLight = lerp(0.0, _Skylight, saturate(-h)) + lerp(0.0, _Equatorlight, saturate(1.0 - abs(h))) + lerp(0.0, _Groundlight, saturate(h)); 4 half lightAngle = asin(clamp(_WorldSpaceLightPos0.y, -1.0, 1.0)) * 180.0 * UNITY_INV_PI; 5 col += additionalLight * lerp(1.0, saturate((_TwilightAngle + _TwilightRange - lightAngle) * 0.5 / _TwilightRange), _NighttimeOnly);

という風に書き換えてみました。Directional Lightの角度をもとに昼夜を判断すればいいんじゃないかと思ったのですが、いかがでしょうか?

投稿2021/07/20 11:04

編集2021/07/20 17:26
Bongo

総合スコア10807

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

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

hosituka

2021/07/20 12:40

回答ありがとうございます。 度重なる質問で申し訳ないのですが朝の色から夕焼け色そして青みたいな感じって出来ませんでしょうか自分で考えられず申し訳ございません
Bongo

2021/07/20 17:27

修正案を考えてみました。「Nighttime Only」をオンにすると夜中だけ上乗せを行うようにしています。 「Twilight Angle」が昼夜の境界となる太陽の角度で、そこから上下に「Twilight Range」の幅でなめらかに切り替える方針で行きました。 デフォルト値はいいかげんに決めましたので、お好みの具合で夕焼け色が残るよう自由に調整してしまってください。
hosituka

2021/07/21 01:59

出来ました、素晴らしい回答をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問