知識0からのUnityShader勉強

知識0からのUnityShader勉強

UnityのShaderをメインとして、0から学んでいくブログです。

【UnityShader】#pragmaのalpha #5

前回の成果

TagブロックからTransparentを指定する意味がわかった。

soramamenatan.hatenablog.com


今回やること

#pragma宣言の意味を理解して、今回こそ3Dオブジェクトの透明度を変化させる!

alpha:fade

// 今まで
#pragma surface surf Standard fullforwardshadows

// 今回
#pragma surface surf Standard alpha:fade

これの一番最後の部分ですね。
これが何を意味しているかを勉強していきます。

オプション名 用途
alpha 透過部分を存在しているように見せる
alpha:auto alphaと同じ
alpha:blend アルファブレンディングを可能にする
alpha:fade 透過部分を存在していないように見せる
alpha:premul プレマルチプライドアルファ透明度を可能にする
alphatest:VariableName アルファカットアウト透明度を有効にする

alpha

f:id:soramamenatan:20190604142214p:plain

普通に透過している。

alpha:auto

f:id:soramamenatan:20190604142340p:plain

alphaに比べて若干影が濃いような気もするが、Unityエディタ上で違いをみてもなにもわからかった。

alpha:blend

f:id:soramamenatan:20190604142655p:plain

ほんの僅かに、透明度がリアルになった。

alpha:fade

f:id:soramamenatan:20190604142655p:plain

blendと同じ。

alpha:premul

f:id:soramamenatan:20190604143403p:plain

alphaとalpha:autoと同じ。

alphatest:VariableName

f:id:soramamenatan:20190604143654p:plain

そもそも透過されていない。
用途が違いそう。

そもそも指定しないと?

f:id:soramamenatan:20190604143654p:plain

透過されません。

結局どれ使えばいい??

調べてみた感じ、基本autoとfadeで良さそう。
他のものは高度すぎてわからなかった

他にも沢山あるのですが、紹介しきれないので詳しく知りたい方は公式を確認してください。

docs.unity3d.com


今回の成果

f:id:soramamenatan:20190604142655p:plain

とりあえず透明になった〜〜〜!

ソースコードにコメントを付与

Shader "Custom/translucent"
{
    SubShader {
        // 半透明オブジェクトを一番最後に描画する
        Tags { "Queue" = "Transparent"}
        // あとで理解する
        LOD 200

        // あとで理解する
        CGPROGRAM
        // 透過させる
        #pragma surface surf Standard alpha:fade
        // あとで理解する
        #pragma target 3.0

        // Input構造体
        struct Input{
            float2 uv_MainTex;
        };

        // surf関数
        void surf(Input IN, inout SurfaceOutputStandard o){
            // ベースカラーの変更
            o.Albedo = fixed4(0.6f,0.7f,0.4f,1);
            // アルファ値の変更
            o.Alpha = 0.6f;
        }
        // あとで理解する
        ENDCG
    }
    // あとで理解する
    FallBack "Diffuse"
}

おまけ

あまり使わなそうな

  • alpha:blend
  • alpha:premul
  • alphatest:VariableName

について少し記述していきます。

alpha:blend

使ってるshaderが見当たらない。

アルファブレンドをするなら

Blend SrcFactor DstFactor

という、アルファブレンドを設定できるものがあるのでそちらを使うことが多い。

詳しいことは、

docs.unity3d.com

qiita.com

このサイト様が参考になる。

alpha:premul

これも同じく見当たらない。
プレマルチプライドアルファ(Premultiplied Alpha)とは、RBGチャンネルにアルファ値が乗算されているもの。

f:id:soramamenatan:20190604152042p:plain

コンポジターに必要なアルファチャンネルの知識(後編) - コンポジゴク:より引用

alphatest:VariableName

上記2つよりも不明。

alphatest:VariableNameは -アルファテストモード。透明カットアウトシェーダに使用します。カットオフ値のVariableNameは、float変数になっています。

と記述されているサイト様はいくつかあるが具体的な説明はなかった。

SurfaceShaderとは関係なさそうだが、一応公式のAlphaTestのリンクを載せておきます。

docs.unity3d.com

完全に理解できたわけではないけど、雰囲気だけわかった気がする。
勉強すべき時が来た時にすればいいか。。。