Unreal EngineのマテリアルでWorldAlignedBlendノードを用いることで法線の向きに基づく処理を行うことができます。WorldAlignBlendノードの実態はマテリアル関数なのでアセットを開けば実装を確認することができます。
内部的な処理をGLSLっぽく書くと次のような操作を行っているようです。
// インプット
vec3 inExplicitNormal = vec3(0.0, 0.0, 1.0);
float blendSharpness = 2.0;
float blendBias = -1.0;
vec3 InWorldVector = vec3(0.0, 0.0, 1.0);
bool clamped = false;
float worldAlignedBlend(float3 normal) {
float v = dot(normalize(InWorldVector), worldSpaceNormal);
v = 0.5 * v * blendSharpness + blendBias;
if (clamped) {
v = clamp(v, 0.0, 1.0);
}
return v;
}
vec3 transformTangentSpaceToWorldSpace(vec3 v) {
// ベクトルをタンジェント空間ワールド空間に変換する関数
}
vec3 worldSpaceNormal; // ワールド空間のピクセル法線
vec3 worldSpaceVertexNormal; // ワールド空間の頂点法線
// アウトプット
float alpha = worldAlignedNormal(worldSpaceNormal);
float withVertexNormals = worldAlignedNormal(worldSpaceVertexNormal);
float withExplicitNormal = worldAlignedNormal(transformTangentSpaceToWorldSpace(inExplicitNormal));
デフォルトのIn World Vector
インプットが上向き(Z方向)なので、上方向に対して法線がどれぐらい向いているかによって出力が変化します。