MPassContext 内の情報は、SSAO (スクリーンスペース アンビエント オクルージョン)をサポートするために要求される特定のパスをレンダリングするためにプラグインがいつ呼び出されるかを示すための十分な情報を提供します。
SSAO の内部アルゴリズムには、中間結果を生成するための特定の法線の深度のパスが必要です。 既定では、レンダラは、このパスに使用される特定のシェーダを設定します。 プラグイン シェーダによってジオメトリがディスプレイスされる、または法線が変更される場合は、この既定値シェーダをオーバーライドすることができます。
この法線の深度パスは、シャドウ マップのパスを検出するのと同様の方法で MPassContext 情報を照会することで検出します(セクション 4.2.1 「 シャドーイング コントロール」を参照)。このパスでは、パス識別子は MPassContext::kNormalDepthPassSemantic となります。
テッセレーション シェーダが必要な場合、オーバーライドを MShaderInstance ではなく MPxShaderOverride に追加する必要があります。
サポートを追加するには、カスタム シェーダは以下の条件を考慮する必要があります。以下に、HLSL で記述された、このパスで使用されるシェーダのサンプルを示します。
// Vertex shader input structure.
struct VS_INPUT_NormalDepth
{
float3 Pos : POSITION;
float3 Normal: NORMAL;
};
// Vertex shader output structure.
struct VS_TO_PS_NormalDepth
{
float4 HPos : SV_Position;
float4 NormalDepth : TEXCOORD0;
};
// Vertex shader.
VS_TO_PS_NormalDepth VS_NormalDepth(VS_INPUT_NormalDepth In)
{
VS_TO_PS_NormalDepth Out;
// Transform the vertex from object space to clip space.
Out.HPos = mul(float4(In.Pos, 1.0f), gWVPXf);
// Record the normal and depth components for the pixel shader.
Out.NormalDepth.xyz = mul(In.Normal, gWVITXf);
Out.NormalDepth.w = mul(float4(In.Pos, 1.0f), gWVXf).z;
return Out;
}
// Pixel shader output structure.
struct PS_OUT
{
float4 Normal : SV_Target0;
float4 Depth : SV_Target1;
};
// Pixel shader.
PS_OUT PS_NormalDepth(VS_TO_PS_NormalDepth In)
{
PS_OUT Out;
// Set the normal for an unsigned normalized integer target, and depth for a floating-point
// target.
Out.Normal = float4((normalize(In.NormalDepth.xyz) + 1.0f) * 0.5f, 0.0f);
Out.Depth = In.NormalDepth.wwww;
return Out;
}