Normal From Height ノード
説明
入力 Input で定義された高さの値と、入力 Strength で定義された強度を持つ法線マップを作成します。
ポート
Name | Direction | タイプ | 説明 |
---|---|---|---|
In | 入力 | Vector 1 | 高さの入力値 |
Strength | 入力 | Vector 1 | 出力される法線の強度。現実世界の単位で考えます。推奨される範囲は 0 - 0.1 です。 |
Out | 出力 | Vector 3 | 出力値 |
制御
Name | タイプ | オプション | 説明 |
---|---|---|---|
Output Space | ドロップダウン | Tangent、World | 出力法線の座標空間を設定します。 |
生成されるコードの例
以下のサンプルコードは、Output Space モードごとに、このノードの出力の一例を示したものです。
Tangent
void Unity_NormalFromHeight_Tangent_float(float In, float Strength, float3 Position, float3x3 TangentMatrix, out float3 Out)
{
float3 worldDerivativeX = ddx(Position);
float3 worldDerivativeY = ddy(Position);
float3 crossX = cross(TangentMatrix[2].xyz, worldDerivativeX);
float3 crossY = cross(worldDerivativeY, TangentMatrix[2].xyz);
float d = dot(worldDerivativeX, crossY);
float sgn = d < 0.0 ? (-1.0f) : 1.0f;
float surface = sgn / max(0.000000000000001192093f, abs(d));
float dHdx = ddx(In);
float dHdy = ddy(In);
float3 surfGrad = surface * (dHdx*crossY + dHdy*crossX);
Out = normalize(TangentMatrix[2].xyz - (Strength * surfGrad));
Out = TransformWorldToTangent(Out, TangentMatrix);
}
World
void Unity_NormalFromHeight_World_float(float In, float Strength, float3 Position, float3x3 TangentMatrix, out float3 Out)
{
float3 worldDerivativeX = ddx(Position);
float3 worldDerivativeY = ddy(Position);
float3 crossX = cross(TangentMatrix[2].xyz, worldDerivativeX);
float3 crossY = cross(worldDerivativeY, TangentMatrix[2].xyz);
float d = dot(worldDerivativeX, crossY);
float sgn = d < 0.0 ? (-1.0f) : 1.0f;
float surface = sgn / max(0.000000000000001192093f, abs(d));
float dHdx = ddx(In);
float dHdy = ddy(In);
float3 surfGrad = surface * (dHdx*crossY + dHdy*crossX);
Out = normalize(TangentMatrix[2].xyz - (Strength * surfGrad));
}