これは Unity Engine Challenge by mixi のShaderチュートリアルです。 Shaderの基礎的な知識や実装方法について、例題を元に理解深めていってください。
シェーダとは色、ライティング、頂点などのレンダリング命令をプログラマブルに記述することで、高度なグラフィック表現を描画処理できるプログラミング言語です。
シェーダ言語の中でも柔軟性の高くモデルの頂点や色をいじることができるのが頂点シェーダ(Vertex Shader)とフラグメントシェーダ(Fragment Shader)です。
頂点シェーダでは、メッシュの頂点に対して操作を行う命令を実装することができます。メッシュを変形させることで波紋などの表現ができたりします。
また、フラグメントシェーダでは、ピクセルのカラー値に対して操作を行う命令を実装することができます。グラデーションや特定のピクセルの色を変えたりできます。
UV座標とは、テクスチャ上の座標を表します。
左下が原点(0,0)として、0~1の座標系で表されます。
シェーダ内では、テクスチャのどの座標を扱うかという情報となるため、
頂点シェーダ内で頂点情報と一緒にUV座標を指定することで、フラグメントシェーダでそのピクセルのカラー値にアクセスすることができます。
シーン上に表示されているQuadの色を変えるようなShaderを実装してください。
Assets/Scenes/Tutorial01
を開いてください。Assets/Shaders/Tutorial01
を開いてください。- 頂点シェーダ
frag
に実装を追加してください。
frag
関数の返り値は各ピクセルのカラー値です。
tex2D
関数はモデルのテクスチャ情報とUV座標情報をを渡すことでピクセルの色計算して返します。
float4 c = tex2D(_MainTex, i.uv);
float4
というのは4要素をもつ型です。
各要素へはr
,g
,b
,a
もしくはx
,y
,z
,w
としてアクセスできます。c.rgb
など組み合わせて扱うこともできます。
シーン上に表示されているQuadにグラデーションをかけるようなShaderを実装してください。 なお、グラデーションの実装にはUV座標を使用してください。
Assets/Scenes/Tutorial02
を開いてください。Assets/Shaders/Tutorial02
を開いてください。- 頂点シェーダ
frag
に実装を追加してください。
モデルの色を変える方法は例題01で実装したとおりです。
グラデーションかける方法は色々ありますが、今回はUV座標を使った実装をしてください。
モデルのUV座標はfrag(v2f i)
の引数i
からi.uv
として得られます。
v2f
とはshaderファイル内で定義されている構造体です。
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
float2
は、x
,y
の2要素を持つ型です。float4
と同様にi.uv.x
のようにアクセスできます。
シーン上に表示されているPlaneの頂点座標を変更して波Shaderを実装してください。
Assets/Scenes/Tutorial03
を開いてください。Assets/Shaders/Tutorial03
を開いてください。- 頂点シェーダ
vert
に実装を追加してください。
vert
関数の返り値は各ピクセルの頂点情報です。
引数で渡されるappdata v
はUnityから受け取るモデルの頂点情報で、それをUnityObjectToClipPos(v.vertex)
でスクリーン上に描画する座標を計算して頂点情報を作成しています。
また、波を実装するには常時値が変わるような変数が必要ですが、組み込み変数として、時間_Time
を使用できます。
上述のUnityObjectToClipPos(float3 pos)
や_Time
はUnityが用意している組み込みの関数や変数になります。
- https://docs.unity3d.com/2019.2/Documentation/Manual/SL-BuiltinFunctions.html
- https://docs.unity3d.com/2019.2/Documentation/Manual/SL-UnityShaderVariables.html
実際の問題では、実機ビルドをして解いてもらう問題があります。
そのため、実機ビルドの手順について確認しておいてください。
実機ビルドするのは例題01, 02, 03のどれでもよいです。
手順
File -> BuildSetting
を選択。- iOS or Androidを選択して
Switch Platform
。- iOSの場合は
Run In as Xcode
をRelease → Debugに変えるとビルド時間が短くできます。
- iOSの場合は
Add Open Scene
を押して、確認したいSceneをScene In Build
に追加。- 実機を自身のPCに接続。
- 接続許可を聞くダイアログが出た場合は、「はい」を選択。
Build and Run
を選択。
下記のような関数が組み込みで用意されてるため、実装のヒントに役立ててください。
fmod(x, y)
x / y
の余剰を返す
floor(x)
x
の少数を切り捨てて返す
step(x, y)
x
とy
の値を比較して、x>=y
なら1、x<y
なら0を返す
saturate(x)
x
を0 <= x <= 1
の範囲に留めて返す
clamp(x, a, b)
x
をa <= x <= b
の範囲に留めて返す
abs(x)
x
の絶対値を返す
sin(x), cos(x)
sin
,cos
の値を返す
これ以外にも様々な関数があるので、調べてより知識を深めてみてください!