Unityシェーダーをボチボチ

Minecraft ShaderMinecraft Shader / mrtnway


 Unityのシェーダーよくわからんよね……と思いながら手を出してみた。

作り方

 Asset上で右クリック > Create > Shader から。
もしくはメニューからAsset > Create > Shader から。
f:id:pongeponge:20160406154214j:plain
ややこしいことに、Shaderは4つある。
Standerd Surface Shader
 基本的にコレ選んでおけばいいって長老が言ってた。
ShaderLab+ Cg/HLSLで書く。
Unlit Shader
 光源に関係しないよう初期設定されてるやつ?よくわからん。
ShaderLab+ Cg/HLSLで書く。
Image Effect Shader
 画面全体へ効果をかける用に初期設定されてるやつ?よくわからん。
ShaderLab+ Cg/HLSLで書く。
Compute Shader
 グラフィックスカード上で動く。
DirectX 11 スタイルの HLSL 言語で書くらしい。


 つまり無難にStanderd Surface Shaderを選んでおけばいいです。多分。

使い方

 Asset上にMaterialを作ってそこにShaderをペイッと貼り付ける。
あとは使いたいGame ObjectにMaterialを追加するだけ。
つまり、Shader単独では意味なくて、Materialが必須。らしい。

基本的な構造

 シェーダーの基本的な構造はこんなの。

//Code.1
Shader シェーダー名 {
	Properties {
		……
	}
	SubShader {
		……
	}
	FallBack "Diffuse"
}

 Shaderの中に1つのPropertiesと、1つ~複数のSubShaderが詰まってる(Code.1ではSubShaderは1つ)。


Unity - マニュアル: ShaderLab シンタックス

シェーダー名

 そのまま。シェーダーの名前。
文字列として表現するので" "で囲む。
例えば、"NewSurfaceShader"にする。

//Code.2
Shader "NewSurfaceShader" {
	……
}

するとInspector上ではこんなんなる。
f:id:pongeponge:20160406160921j:plain


 他にも、"Custom/NewSurfaceShader"とすると

//Code.3
Shader "Custom/NewSurfaceShader" {
	……
}

こんなふうにグループ化ができる。
f:id:pongeponge:20160406161900j:plain
"A/B/NSS"と書けば、「Aグループ内のBグループ内にあるNSSというシェーダー」という意味になる。
今はいらんけど、シェーダーが増えたら便利そう。

Properties

 Inspector上にスライダーとか色決めるアレとかあるやん。アレや。
…ではわからんので、例えばこう書いたとする。

//Code.4
Properties {
	//テクスチャプロパティ
	_MainTex("Texture", 2D) = "white" {}
	//最小値0.1、最大値5のスライダー
	_Scale ("Scale", Range(0.1, 5)) = 1.0
	//最小値0.1、最大値5のスライダー
	_Limit("Limit", Range(1, 256)) = 256
}

するとInspectror上ではこう表示される。
f:id:pongeponge:20160406163704j:plain


Unity - マニュアル: ShaderLab :プロパティー


なんか長くなってきたのでここらあたりで一旦終了。