なんとかするから、なんとかなる

エンジニア関係のことを書きます

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でその色情報を取り出すことで、テクスチャの貼り付けができる。

参考資料

github.com

デモでかなりわかりやすく各Shaderを紹介していたので、動画が待ち望まれる!