UnityCG.cginc には、シェーダーをより簡単に書くためにデザインされたいくつかのビルトインユーティリティ関数があります。
| 機能 | 説明: |
|---|---|
float4 UnityObjectToClipPos(float3 pos) |
同次座標において、オブジェクト空間からカメラのクリップスペースへ点を変換します。これは、mul(UNITY_MATRIX_MVP, float4(pos, 1.0)) と同等であり、代替として使用されます。 |
float3 UnityObjectToViewPos(float3 pos) |
点をオブジェクト空間からビュー空間へ変換します。これは、mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz と同等であり、代替として使用されます。 |
| 機能 | 説明: |
|---|---|
float3 WorldSpaceViewDir (float4 v) |
指定されたオブジェクト空間の頂点位置からカメラへのワールド空間方向 (正規化なし) を返します。 |
float3 ObjSpaceViewDir (float4 v) |
指定されたオブジェクト空間の頂点位置からカメラへのオブジェクト空間方向 (正規化なし) を返します。 |
float2 ParallaxOffset (half h, half height, half3 viewDir) |
視差法線マッピングの UV オフセットを計算します。 |
fixed Luminance (fixed3 c) |
色を輝度 (グレイスケール) に変換します。 |
fixed3 DecodeLightmap (fixed4 color) |
色を Unity のライトマップにデコードします (プラットフォームにより、RGBM か dLDR)。 |
float4 EncodeFloatRGBA (float v) |
低精度のレンダーターゲットのストレージのために (01) の範囲の float を RGBA 色にエンコードします。 |
float DecodeFloatRGBA (float4 enc) |
RGBA を float にデコードします。 |
float2 EncodeFloatRG (float v) |
(01) の範囲の float を float2 にエンコードします。 |
float DecodeFloatRG (float2 enc) |
以前にエンコードされた RG float をデコードします。 |
float2 EncodeViewNormalStereo (float3 n) |
ビュー空間法線を (01) の範囲の 2 つの数字にエンコードします。 |
float3 DecodeViewNormalStereo (float4 enc4) |
ビュー空間法線を enc4.xy からデコードします。 |
これらの関数はフォワードレンダリングを使用する場合にのみ有用です (ForwardBase か ForwardAdd パスタイプ)。
| 機能 | 説明: |
|---|---|
float3 WorldSpaceLightDir (float4 v) |
オブジェクト空間の頂点位置を指定して、ライトへのワールド空間の方向 (正規化なし)を計算します。 |
float3 ObjSpaceLightDir (float4 v) |
オブジェクト空間の頂点位置を指定して、ライトへのオブジェクト空間の方向 (正規化なし)を計算します。 |
float3 Shade4PointLights (...) |
ベクトルに密に格納されたライトデータが配置された 4 点ライトからイルミネーションを計算します。頂点ごとのライティングを計算するためにフォワードレンダリングによって使用されます。 |
以下の関数は、スクリーンスペーステクスチャのサンプリングに使用される座標を計算するためのヘルパーです。これらは、テクスチャをサンプリングする最終座標が透視分割 (例: xy/w) によって計算できる float4 を返します。
関数はまた、レンダーテクスチャ座標におけるプラットフォームの違いにも対応します。
| 機能 | 説明: |
|---|---|
float4 ComputeScreenPos (float4 clipPos) |
スクリーンスペースでマッピングをしたテクスチャサンプルのテクスチャ座標を計算します。入力はクリップスペース位置です。 |
float4 ComputeGrabScreenPos (float4 clipPos) |
GrabPass テクスチャをサンプリングするためのテクスチャ座標を計算します。入力はクリップスペース位置です。 |
これらの関数は頂点ごとのライティングシェーダーを使用する場合にのみ有用です (Vertex パスタイプ)。
| 機能 | 説明: |
|---|---|
float3 ShadeVertexLights (float4 vertex, float3 normal) |
オブジェクト空間の位置と法線を指定して、4 つの頂点ごとのライトとアンビエントからイルミネーションを計算します。 |
シャドウマップの宣言およびサンプリングはプラットフォームにより大きく異なる場合があります。Unity には、これに対応するためのマクロがいくつかあります。
| マクロ | 用途 |
|---|---|
UNITY_DECLARE_SHADOWMAP(tex) |
tex という名前のシャドウマップテクスチャ変数を宣言します。 |
UNITY_SAMPLE_SHADOW(tex,uv) |
tex という名前のシャドウマップテクスチャを特定の uv 座標にサンプリングします (XY コンポーネントはテクスチャの場所、Z コンポーネントは相対的な深度)。0 - 1 の範囲でシャドウとして 1 つの Float 値を返します。 |
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) |
上記と同様ですが、投影法のシャドウマップ読み込みを行います。uv は float4 であり、他のすべてのコンポーネントはルックアップをするために .w で除算します。 |
tex の形式は RenderTextureFormat.Shadowmap であることが必要です。
__(注記)__すべてのグラフィックスカードがシャドウマップをサポートしているわけではありません。サポートを確認するために SystemInfo.SupportsRenderTextureFormat を使用します。
ほとんどの場合深度テクスチャはカメラからの深度をレンダリングするのに使用されます。このケースの UnityCG.cginc インクルードファイルには上記の複雑さに対応するためのマクロが含まれています。
__注意__DX11/12 と Metal では、Z バッファの範囲は 1 から 0 であり、UNITY_REVERSED_Z は定義されます。他のプラットフォームでは、範囲は 0 から 1 です。
例えば、このシェーダーはオブジェクトの深度をレンダリングします。
Shader "Render Depth" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 depth : TEXCOORD0;
};
v2f vert (appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
UNITY_TRANSFER_DEPTH(o.depth);
return o;
}
half4 frag(v2f i) : SV_Target {
UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
}
}
}