読者です 読者をやめる 読者になる 読者になる

おもちゃラボ

Unityで遊びを作っていきます

【Unityシェーダ入門】Unityのシェーダで遊んでみよう

Unity シェーダ

Unityのシェーダって、かっこ良い表現ができるらしいけど、難しそう・・・
というイメージがありますよね。

f:id:nn_hokuson:20160911214243p:plain

実際に、C#のプログラムとかと比べると
すこしトリッキィーに感じる部分も沢山あります。

ですが、基本的には高校レベルの数学と画像処理の簡単な知識があれば(この大前提がそもそも難しいわけですが)なんとかなります。

これから何回かにわたって、シェーダの面白さを紹介していきたいと思います。

下準備

最初にシェーダの実験をするプロジェクトの土台を作ります。

といっても、モデルを配置してキューブマップを設定するだけですので、ここでは下ごしらえが終わったUnityプロジェクトを下のリンクからダウンロードして下さい。

www.dropbox.com

プロジェクトビューで右クリック→「Create」→「Shader」→「Standard Surface Shader」でシェーダファイルを作ります。名前はsampleにしておきましょう。

続けて、いま作成したsampleシェーダを選択した状態で「Create」→「Material」マテリアルを作成します。こちらも名前はsampleにしておきます(シェーダファイルと違う名前でも問題ないです)

f:id:nn_hokuson:20160911221022p:plain

いま作成したマテリアルを3Dモデルにアタッチした後、インスペクタからマテリアルのシェーダをCustom/sampleに変更します。

f:id:nn_hokuson:20160911220810p:plain

見た目は変わりませんが、モデルにはsampleマテリアルにアタッチしたsampleシェーダが適用されています。

このように、Unityではマテリアルとシェーダが一対一でひも付きます

f:id:nn_hokuson:20160911225133p:plain

シェーダの中身をみてみよう

プロジェクトビューのsampleシェーダを開いて中身を見てみましょう。
いろいろ書いていますが、大きく分けると3つのパートにわかれます。

f:id:nn_hokuson:20160911224654p:plain

公開する変数はpublic変数のようなもので、ここで変数を宣言しておくとインスペクタから値を操作できるようになります。それ以外は、基本的にはシェーダ本体の部分を修正して目的のシェーダを作ります。

シェーダを書き換えてみよう

プロジェクトビューのsampleシェーダを開いて、surf関数を次のように修正してください。

void surf (Input IN, inout SurfaceOutputStandard o) {
	// Albedo comes from a texture tinted by color
	fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
	o.Albedo = fixed4(0.1f, 0.1f, 0.1f, 1);
	// Metallic and smoothness come from slider variables
	o.Metallic = _Metallic;
	o.Smoothness = _Glossiness;
	o.Alpha = c.a;
}

ここではo.Albedoに代入する値をテクスチャの値から黒色に変更しています。

f:id:nn_hokuson:20160911230711p:plain

Albedoはオブジェクトの基本色を定義するものです。AlbedoにRGB(0.1, 0.1, 0.1)にしたことで黒っぽくなっています。

ドラゴンの表面の色として同じ色を指定しているんだから「もっとのっぺりしたドラゴンになるんじゃないの?」と思うかもしれません。
実はこのsurf関数でマテリアルの色を指定した後に、ライティングをするステージがあります。
これによりドラゴンの影になる部分は暗く、光が当たる部分は明るくなるため立体感がでます。

今回は一般的なシェーダの中身を簡単に眺めました。次回は、最小限のシェーダを書いてみます。

nn-hokuson.hatenablog.com