Unite2017 参加しました その5
シェーダープログラミング入門!カスタムシェーダー、作るで!
www.slideshare.net
rendering pipeline
どのようにして、Unityがレンダリングを実行するか
shaderを書くための言語
CG(C for Graphics) Sessionで使われてた言語はこれ。 C言語に似た言語
Shader Lab
CG(C for Graphics)の見方
v2f
v2fではvertexをCG(C for Graphics)で使えるようにするための構造体
Properties
Propertiesを利用することで、UnityのInspectorから値を指定することができる。 詳しくは参考URLのサンプルプログラムShader4
Shaderのタイプは大きく分け3つ
それぞれ表現方法によってどれを使うかは異なる。 基本的な使い方は、subshader の中にそれぞれに対応する関数を作ってあげる。
- Vertex Sharders
- Fragment Shaders
- Surface Shaders
Vertex Shaders
Vertex Shadersでは頂点を入力に対して、頂点を位置を変更して出力する。 Shaderで動きをつけたいときに使える。
flaot vert(appdata_base v)
頂点座標に対して処理を実行する
- 引数 appdata_base 頂点(vertex), 法線(normal), UV情報(texcorrd)が含まれている。 より詳細な情報(UV2)などは、appdata_fullという構造体に含まれている。
v.vertexに対して、倍率を指定すると拡大/縮小して表示することがができる。 時間などの係数をかけることで、簡単なモーションを表現することもできる。
Fragment Shaders
Pixcel 1つ1つに対して、色やAlpha値を変更するときに使える。 色彩の表現を付け加えるときに便利。
half4 frag(v2f i)
この関数のなかで各ピクセルに対して処理を実行することができる。
Sessionでは、この関数で以下を返すことで、Shaderが適応されたオブジェクト赤色になっていた。
return half4(1,0,0,1)
Surface Shaders
Pixel 1つ1つに対する処理というよりは、面に対して何かしらの表現を付け加えるときに便利。
void surf(Input IN, inout SurfaceOutput o)
事前にテクスチャをして置き、SurfaceOutputのalbedoを指定することでテクスチャを貼り付けることができる。
o.Albedo = tex2D(_MainTexture, IN.uv_MainTexture).rgb;
tex2Dの第二引数IN.uv_MainTextureでuv座標を指定しているため、第二引数を動的に変化させることでTexutureがオブジェクトの表面を流れるような表現をすることができる。
Emmission Texture
MainTextureが全体に対するベースとなるTexutureで、EmmissionTextureその上に張ることができる。Texutureを重ねて表現するときに便利
参考 その他テクスチャの張り方
事前にテクスチャを指定しておき、vert関数でuv座標を指定、fragでその色情報を取り出すことで、テクスチャの貼り付けができる。