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

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

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

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

Q&A

1回答

2931閲覧

Untiy ASE ライトが当たっていない時に表示されるシェーダを作成したい。

sabu6094

総合スコア10

Unity3D

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

0グッド

0クリップ

投稿2018/09/21 08:49

こんにちは
シェーダの勉強をしているものです。
Amplify Shader Editorを私用してライトの影響がないときにテクスチャが表示されるシェーダを作成したいと考えております。

Amplify Shader EditorのサンプルにあるUVLightRevealのライトに照らされるとテクスチャが浮かび上がってくる表現を応用してできないか試行錯誤していますが、うまくいきません。画像のどこを調整すればいいのでしょうか。イメージ説明

周りには詳しい人はおらず、ネットでもなかなか出できません。
どなたか回答をいただけると大変助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

すみませんがAmplify Shader Editorを持っていないため、通常のシェーダーでの案となってしまいますがご容赦ください...

実験の題材として、「地球儀をスポットライトで照らし、照らされていない部分にのみ夜の明かりを描く」というのをやってみました。
Amplify Shader Editorで作れるかどうかは不確かですが、このようなプロセスでやれないでしょうか?

  • ライトで照らされている領域を求めるため、まず強制的にアルベドを白、メタリック・スムースネスを0にしてレンダリングし、結果をグラブする。

わざわざこうしたのは、テクスチャが貼ってあったり余計なものが映り込んでいたりすると、本当にライトが当たっていないため暗いのか、アルベドや映り込みのために暗いのか区別できないためです。

  • 通常通り、アルベドなど表面の特性を適用してレンダリングする。
  • 先にグラブした結果を用いて照らされた領域をマスキングし、影部分にのみ加算用テクスチャを合成する。

ShaderLab

1Shader "Custom/Phosphorescence" { 2 Properties { 3 _Color ("Color", Color) = (1,1,1,1) 4 _MainTex ("Albedo (RGB)", 2D) = "white" {} 5 _Glossiness ("Smoothness", Range(0,1)) = 0.5 6 _Metallic ("Metallic", Range(0,1)) = 0.0 7 _PhosphoTex ("Phosphorescence", 2D) = "black" {} // 暗い部分に加算するテクスチャ 8 _IlluminanceExp ("Illuminance Exponent", Range(0,16)) = 8.0 // 白黒反転後の冪指数 9 } 10 SubShader { 11 Tags { "RenderType"="Opaque" } 12 LOD 200 13 14 // まず、アルベドを強制的に1にして全ライトの照明効果をレンダリング 15 CGPROGRAM 16 #pragma surface surf Standard fullforwardshadows 17 #pragma target 3.0 18 19 struct Input { 20 float2 uv_MainTex; 21 }; 22 23 void surf (Input IN, inout SurfaceOutputStandard o) { 24 o.Albedo = 1.0; 25 o.Metallic = 0.0; 26 o.Smoothness = 0.0; 27 o.Alpha = 1.0; 28 } 29 ENDCG 30 31 // ここまでのレンダリング結果をグラブ 32 GrabPass {} 33 34 // 通常のレンダリング(処理内容はデフォルトのサーフェイスシェーダーと同様) 35 CGPROGRAM 36 #pragma surface surf Standard fullforwardshadows 37 #pragma target 3.0 38 39 sampler2D _MainTex; 40 41 struct Input { 42 float2 uv_MainTex; 43 }; 44 45 half _Glossiness; 46 half _Metallic; 47 fixed4 _Color; 48 float _ColorExp; 49 50 void surf (Input IN, inout SurfaceOutputStandard o) { 51 fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 52 o.Albedo = c.rgb; 53 o.Metallic = _Metallic; 54 o.Smoothness = _Glossiness; 55 o.Alpha = c.a; 56 } 57 ENDCG 58 59 // 最後に、グラブした結果の影部分だけに加算用テクスチャを加算する 60 Pass 61 { 62 // ブレンドモードは加算合成にしておく 63 Blend One One 64 65 CGPROGRAM 66 #pragma vertex vert 67 #pragma fragment frag 68 69 #include "UnityCG.cginc" 70 71 struct appdata 72 { 73 float4 vertex : POSITION; 74 float2 uv : TEXCOORD0; 75 }; 76 77 struct v2f 78 { 79 float2 uv : TEXCOORD0; 80 float4 grabCoord : TEXCOORD1; 81 float4 vertex : SV_POSITION; 82 }; 83 84 sampler2D _PhosphoTex; 85 float4 _PhosphoTex_ST; 86 sampler2D _GrabTexture; 87 float _IlluminanceExp; 88 89 v2f vert (appdata v) 90 { 91 v2f o; 92 o.vertex = UnityObjectToClipPos(v.vertex); 93 o.uv = TRANSFORM_TEX(v.uv, _PhosphoTex); 94 o.grabCoord = ComputeGrabScreenPos(o.vertex); 95 return o; 96 } 97 98 fixed4 frag (v2f i) : SV_Target 99 { 100 // 加算用テクスチャから色を取得 101 float3 phosphorescence = tex2D(_PhosphoTex, i.uv).rgb; 102 103 // グラブ結果から色を取得 104 float3 grabbed = tex2Dproj(_GrabTexture, i.grabCoord).rgb; 105 106 // グラブ結果のRGBのうち最大の量を、このピクセルがライトで照らされている強さとする 107 float illuminance = max(max(grabbed.r, grabbed.g), grabbed.b); 108 109 // ライト強度を白黒反転し、さらに適当に冪乗することで多少薄暗い領域には加算効果が発生しないようにした上で 110 // 加算用テクスチャ色と乗算し、これをピクセルへの加算値とする 111 fixed3 result = phosphorescence * pow(1.0 - illuminance, _IlluminanceExp); 112 113 return fixed4(result, 0.0); 114 } 115 ENDCG 116 } 117 } 118 FallBack "Diffuse" 119}

プロセス
アニメーション

投稿2018/09/23 00:50

Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問