ユニティちゃんで学習。座標を色に変換するUnity 3Dシェーダーの作り方。
スクリーン座標について。
関連ページ
参考URL
前回
はマテリアルに単色を代入するシェーダーを作りました。
今回はモデルの座標を無理やり色に変換するシェーダーを作っていきます。

テストに使う3Dモデル
3Dモデルは
ユニティちゃんPackege
と
UnityToonShader
を使っていきます。

スクリーン座標を色に変換するシェーダー
頂点シェーダーで受け取った座標を、ピクセルシェーダーで色に変換するコードを書いていきます。
実用的ではないですが、シェーダーの仕組みを知るのに割と便利です。
以下コード全文です。
Shader
"Unlit/CoordinatesColor"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma
vertex
vert
#pragma
fragment
frag
//後述のComputeScreenPos関数に必要な宣言
#include
"UnityCG.cginc"
struct
appdata
{
float4
vertex
:
POSITION;
};
struct
v2f
{
float4
vertex
:
SV_POSITION;
//スクリーン座標を保存してピクセルシェーダーに伝えるために追加
float4
screenPos
:
TEXCOORD0;
};
// 頂点シェーダー
v2f
vert
(appdata
v)
{
v2f
o;
// ワールド座標をカメラを原点とする座標系に変換し、
// かつカメラの画角外の頂点を削ります
o.vertex
=
UnityObjectToClipPos(v.vertex);
// クリップ座標を正規化してスクリーン座標に変換
o.screenPos
=
ComputeScreenPos(o.vertex);
return
o;
}
// ピクセルシェーダー
fixed4
frag
(v2f
i)
:
SV_Target
{
//座標情報を無理やり色に変換
//x軸をrに、y軸をgに、z軸をbに代入する
return
fixed4(i.screenPos.x,
i.screenPos.y,
i.screenPos.z,
1);
}
ENDCG
}
}
}
ユニティちゃんの服に使っているdef_matのシェーダーを、作成したシェーダーに変更します。
実装した結果は次のようなものになります。

スクリーン座標とは何か
Unityシェーダーで言うスクリーン座標とは、UnityC#でいうビューポート座標のことです。
カメラの画角の左下をx=0, y=0として、右上をx=1, y=1とする、正規化された座標の事を言います。
z軸はカメラを原点として、カメラの描画方向の奥に進むごとに値が増えていきます。

コードを少し解説
最初に、使いたい関数を使うのに必要なコンポーネントをincludeしています。
C#でいうusingと同じような処理です。
//後述のComputeScreenPos関数に必要な宣言
#include
"UnityCG.cginc"
出力頂点構造体の方にのみ、ピクセルシェーダーに渡す変数を追加しています。
//スクリーン座標を保存してピクセルシェーダーに伝えるために追加
float4
screenPos
:
TEXCOORD0;
この変数には頂点シェーダー内でスクリーン座標を代入します。
下がその、実際にスクリーン座標を代入している処理です。
// クリップ座標を正規化してスクリーン座標に変換
o.screenPos
=
ComputeScreenPos(o.vertex);
最後にスクリーン座標を無理やり色に変換して完成。
//座標情報を無理やり色に変換
//x軸をrに、y軸をgに、z軸をbに代入する
return
fixed4(i.screenPos.x,
i.screenPos.y,
i.screenPos.z,
1);
0
0