知識0からのUnityShader勉強

知識0からのUnityShader勉強

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

【UnityShader】input構造体 #2

前回の成果

f:id:soramamenatan:20190511190832p:plain

白いドラゴンが


f:id:soramamenatan:20190511192153p:plain

黒くなりました。

soramamenatan.hatenablog.com


続きをやってみる

今回も引き続き、おもちゃラボ様を参考に勉強をします。 今回はこちら

nn-hokuson.hatenablog.com

最小限のシェーダー

Shader "Custom/sample" {
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0
        
        struct Input {
            float2 uv_MainTex;
        };
        
        void surf (Input IN, inout SurfaceOutputStandard o) {
            o.Albedo = fixed4(1.0f, 1.0f, 1.0f, 1);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

こちらが最小限のシェーダーです。 またsurf関数の中でAlbedoを変更しているので、ただ色を変えているだけっぽい。


ソースコードの中身

本家様はTags~#pragmaまでの行の説明は今回省くそうなので、私も省きます。

struct Input {
            float2 uv_MainTex;
        };

どうやらこのInputがsurf関数の第一引数と関係してそう。


input構造体

変数名 用途
float2 uv_MainTex テクスチャのuv座標
float2 screenPos スクリーンの座標
float3 worldPos スクリーンの座標
float3 viewDir 視線の方向

ここでは、特定の色で塗りつぶすだけなので入力としてテクスチャのuv情報(uv_MainTex)は必要はないのですが、Input structの中身が空ではコンパイルが通らないための苦肉の策です。

今回はinput構造体は使用していないが、必ず定義しないといけないらしい。

nn-hokuson.hatenablog.com


output構造体

変数名 用途
fixed3 Albedo ベースカラー
fixed3 Normal 法線
fixed3 Emission 発光色
half Specular 鏡面情報
fixed Gloss 艶情報
fixed Alpha 透明度

outputは

void surf (Input IN, inout SurfaceOutputStandard o) {
            o.Albedo = fixed4(1.0f, 1.0f, 1.0f, 1);
        }

このソースの

inout SurfaceOutputStandard o

この部分こと。

f:id:soramamenatan:20190512200146p:plain

【Unityシェーダ入門】20行から始めるUnityミニマルシェーダ - おもちゃラボ:より引用

この画像からわかるように、output構造体に記述してあげないと変化が出ない。

input、output構造体はこのサイト様を参考にしました。

qiita.com


Emission?Specular?Gloss?

勉強不足でどれがどれか曖昧でした。


Emission

表面から放出される光の色と強度を制御します。
emissive マテリアルは、シーン内で使用される場合、それ自体が可視光の光源であるように見えます。
オブジェクトは “自己発光” しているように見えます。

自分自身の発光度合いみたいなことですね。

f:id:soramamenatan:20190513171213j:plain

Emission - Unity マニュアル:より引用

シーンが暗いのに、明るく発光しています。


Specular

スペキュラー効果は本質的には、シーンの光源の直接反射で、通常はオブジェクトの表面の明るいハイライトや輝きとして表れます。

つまり、鏡の様な反射を表しています。

f:id:soramamenatan:20190513172716p:plain

スペキュラーモード: Specular パラメーター - Unity マニュアル:より引用

スペキュラーの値が0に近いほど反射せず、1に近いほど反射しますね。

docs.unity3d.com


Gloss

色々調べてみたが、Gloss ≒ smoothnessなので、smoothnessについて記述します。

「微細なサーフェスの詳細」や、サーフェスの滑らかさを制御できます。

なるほど、わからん。
もう少し調べてみる。

f:id:soramamenatan:20190513173615p:plain

Smoothness - Unity マニュアル:より引用

smoothnessの値が左は低く、右は高い。
これを見るに、オブジェクトの凸凹を表すようだ。


f:id:soramamenatan:20190513193910p:plain

Smoothness - Unity マニュアル:より引用

値を増やすと、どんどん綺麗に反射していく。
幼稚園の時によく作っていた泥団子にイメージが近いのかもしれない。


f:id:soramamenatan:20190514103023j:plain

Smoothness - Unity マニュアル:より引用

smoothnessの値が上が低く、下が高い。


今回の成果

f:id:soramamenatan:20190512201354p:plain

せっかくなので赤くしてみた。


ソースコード

Shader "Custom/sample" {
    SubShader{
        
        // 後で理解する
        Tags{ "RenderType" = "Opaque" }
        LOD 200
        
        // 後で理解する
        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0
        
        // input構造体
        struct Input {
            // 必要ないが、surf関数を使うために仕方なく使用
            float2 uv_MainTex;
        };
        
        // surf関数
        void surf(Input IN, inout SurfaceOutputStandard o) {
            // ベースカラーを赤にする
            o.Albedo = fixed4(1.0f, 0, 0, 1);
        }
        // 後で理解する
        ENDCG
    }
    // 後で理解する
    FallBack "Diffuse"
}

思ったより長くなってしまったので、fixedやhalfといった変数のことは次回説明したいと思います。
次回も引き続きシェーダーの勉強をして参ります!

nn-hokuson.hatenablog.com