ステンドグラスをつくる回です
nn-hokuson.hatenablog.com
例のごとく素材がないので無敵のPowerPointでなんとかします。
ステンドグラスシェーダのプログラム
Shader "Custom/sample" { Properties{ _MainTex("Texture", 2D) = "white"{} } SubShader{ Tags{ "Queue" = "Transparent" } LOD 200 CGPROGRAM #pragma surface surf Standard alpha:fade #pragma target 3.0 struct Input { float2 uv_MainTex; }; sampler2D _MainTex; void surf(Input IN, inout SurfaceOutputStandard o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; //グレースケースへの変換式 //grayscale = 0.3 * R + 0.6 * G + 0.1 * B //0.2以下(黒色付近)で透明度を1に、そうでなければ透明度を0.7にする o.Alpha = (c.r*0.3 + c.g*0.6 + c.b*0.1 < 0.2) ? 1 : 0.7; } ENDCG } FallBack "Diffuse" }
これパワポだぜ?
ステンドグラスシェーダのノード
完成図です。
分解していきましょう
まずはグレースケールをつくるパートです。TextureのR, G, BにMultiplyで各項に0.3, 0.6, 0.1を掛け合わせて全て足します。
条件分岐です。条件分岐にはStepノードを使います。Stepとは入力に対して、閾値以上であれば1そうでなければ0を返すノードです。
今回で言えば0.2ですね。0.2以下であれば1をかけ、0.2以上であれば0.7を掛けて足し合わせます。
完成です。
(大変に愚かだった頃のノード)
完成図です。なぜこんなことになったのかというと、"条件式がない"
分解していきましょう
まずはグレースケールをつくるパートです。TextureのR, G, BにMultiplyで各項に0.3, 0.6, 0.1を掛け合わせて全て足します。
ここからが大変でした。if文のところです。
- -0.2をして-0.2~0.8の値にする。
- Clamp(0, 0.01)とすることで元々0.2以下だった値は0になり、0.2以上は0.01になります。
- 0.01で割ります。0.2以下だった値は0、0.2以上だった値は1になります。
- OneMinusで反転させます。
- 0.7を加算します。これで値は0.7または1.7のどちらかになります。
- Clampで1以上の値を1にします。
- Alphaに代入します。
そしてAlbedoにTextureのRGBを入力してやれば完成です。
ShaderForgeとかなら恐らく難なく実装できた部分なんでしょうが、条件式使えないのって大変ですね…