White Balance 노드
설명
Temperature 입력과 Tint 입력의 양만큼 In 입력의 온도와 색조를 각각 조정합니다. Temperature는 값을 노란색 또는 파란색으로 전환하는 효과가 있고, Tint는 분홍색 또는 녹색으로 전환하는 효과가 있습니다.
포트
이름 | 방향 | Type | 바인딩 | 설명 |
---|---|---|---|---|
In | 입력 | 벡터 3 | None | 입력 값 |
Temperature | 입력 | 플로트 | None | 온도 오프셋 값 |
Tint | 입력 | 플로트 | None | 색조 오프셋 값 |
Out | 출력 | 벡터 3 | None | 출력 값 |
생성된 코드 예제
다음 예제 코드는 이 노드의 가능한 결과 중 하나입니다.
void Unity_WhiteBalance_float(float3 In, float Temperature, float Tint, out float3 Out)
{
// Range ~[-1.67;1.67] works best
float t1 = Temperature * 10 / 6;
float t2 = Tint * 10 / 6;
// Get the CIE xy chromaticity of the reference white point.
// Note: 0.31271 = x value on the D65 white point
float x = 0.31271 - t1 * (t1 < 0 ? 0.1 : 0.05);
float standardIlluminantY = 2.87 * x - 3 * x * x - 0.27509507;
float y = standardIlluminantY + t2 * 0.05;
// Calculate the coefficients in the LMS space.
float3 w1 = float3(0.949237, 1.03542, 1.08728); // D65 white point
// CIExyToLMS
float Y = 1;
float X = Y * x / y;
float Z = Y * (1 - x - y) / y;
float L = 0.7328 * X + 0.4296 * Y - 0.1624 * Z;
float M = -0.7036 * X + 1.6975 * Y + 0.0061 * Z;
float S = 0.0030 * X + 0.0136 * Y + 0.9834 * Z;
float3 w2 = float3(L, M, S);
float3 balance = float3(w1.x / w2.x, w1.y / w2.y, w1.z / w2.z);
float3x3 LIN_2_LMS_MAT = {
3.90405e-1, 5.49941e-1, 8.92632e-3,
7.08416e-2, 9.63172e-1, 1.35775e-3,
2.31082e-2, 1.28021e-1, 9.36245e-1
};
float3x3 LMS_2_LIN_MAT = {
2.85847e+0, -1.62879e+0, -2.48910e-2,
-2.10182e-1, 1.15820e+0, 3.24281e-4,
-4.18120e-2, -1.18169e-1, 1.06867e+0
};
float3 lms = mul(LIN_2_LMS_MAT, In);
lms *= balance;
Out = mul(LMS_2_LIN_MAT, lms);
}