Normal From Height 노드
설명
Strength 입력에서 정의된 강도를 사용하여 Input 입력에서 정의된 높이 값으로 노멀 맵을 생성합니다.
포트
이름 | 방향 | Type | 설명 |
---|---|---|---|
In | 입력 | 플로트 | 입력 높이 값 |
Strength | 입력 | 플로트 | 출력 노멀의 강도입니다. 실제 단위로 고려할 때 권장 범위는 0-0.1입니다. |
Out | 출력 | 벡터 3 | 출력 값 |
컨트롤
이름 | Type | 옵션 | 설명 |
---|---|---|---|
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));
}