【UnityShader】input構造体 #2
前回の成果
白いドラゴンが
黒くなりました。
続きをやってみる
今回も引き続き、おもちゃラボ様を参考に勉強をします。 今回はこちら
最小限のシェーダー
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構造体は使用していないが、必ず定義しないといけないらしい。
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
この部分こと。
この画像からわかるように、output構造体に記述してあげないと変化が出ない。
input、output構造体はこのサイト様を参考にしました。
Emission?Specular?Gloss?
勉強不足でどれがどれか曖昧でした。
Emission
表面から放出される光の色と強度を制御します。
emissive マテリアルは、シーン内で使用される場合、それ自体が可視光の光源であるように見えます。
オブジェクトは “自己発光” しているように見えます。
自分自身の発光度合いみたいなことですね。
シーンが暗いのに、明るく発光しています。
Specular
スペキュラー効果は本質的には、シーンの光源の直接反射で、通常はオブジェクトの表面の明るいハイライトや輝きとして表れます。
つまり、鏡の様な反射を表しています。
スペキュラーの値が0に近いほど反射せず、1に近いほど反射しますね。
Gloss
色々調べてみたが、Gloss ≒ smoothnessなので、smoothnessについて記述します。
なるほど、わからん。
もう少し調べてみる。
smoothnessの値が左は低く、右は高い。
これを見るに、オブジェクトの凸凹を表すようだ。
値を増やすと、どんどん綺麗に反射していく。
幼稚園の時によく作っていた泥団子にイメージが近いのかもしれない。
smoothnessの値が上が低く、下が高い。
今回の成果
せっかくなので赤くしてみた。
ソースコード
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といった変数のことは次回説明したいと思います。
次回も引き続きシェーダーの勉強をして参ります!