こんにちは
シェーダの勉強をしているものです。
Amplify Shader Editorを私用してライトの影響がないときにテクスチャが表示されるシェーダを作成したいと考えております。
Amplify Shader EditorのサンプルにあるUVLightRevealのライトに照らされるとテクスチャが浮かび上がってくる表現を応用してできないか試行錯誤していますが、うまくいきません。画像のどこを調整すればいいのでしょうか。
周りには詳しい人はおらず、ネットでもなかなか出できません。
どなたか回答をいただけると大変助かります。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア10811
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。