diff --git a/addons/ShaderLib/Artistic/Adjustment/WhiteBalance.gd b/addons/ShaderLib/Artistic/Adjustment/WhiteBalance.gd new file mode 100644 index 0000000..f56d33b --- /dev/null +++ b/addons/ShaderLib/Artistic/Adjustment/WhiteBalance.gd @@ -0,0 +1,64 @@ +@tool +class_name VisualShaderNodeWhiteBalance extends VisualShaderNodeCustom + +func _get_name() -> String: + return "WhiteBalance" + +func _get_category() -> String: + return "Artistic/Adjustment" + +func _get_description() -> String: + return "Adjusts the temperature and tint of input \"in\" by the amount of inputs \"temperature\" and \"tint\" respectively." + +func _get_return_icon_type() -> PortType: + return PORT_TYPE_VECTOR_3D + +func _get_input_port_count() -> int: + return 3 + +func _get_input_port_name(port: int) -> String: + match port: + 0: + return "in" + 1: + return "temperature" + _: + return "tint" + +func _get_input_port_type(port: int) -> PortType: + match port: + 0: + return PORT_TYPE_VECTOR_3D + _: + return PORT_TYPE_SCALAR + +func _get_input_port_default_value(port: int) -> Variant: + match port: + 1, 2: + return 0.0 + _: + return null + +func _get_output_port_count() -> int: + return 1 + +func _get_output_port_name(port: int) -> String: + return "out" + +func _get_output_port_type(port: int) -> PortType: + return PORT_TYPE_VECTOR_3D + +func _get_global_code(mode: Shader.Mode) -> String: + var code: String = preload("WhiteBalance.gdshaderinc").code + return code + +func _get_code(input_vars: Array[String], output_vars: Array[String], mode: Shader.Mode, type: VisualShader.Type) -> String: + var input: String = "vec3(1.0)" + + if input_vars[0]: + input = input_vars[0] + + var temperature: String = input_vars[1] + var tint: String = input_vars[2] + + return output_vars[0] + " = white_balance(%s, %s, %s);" % [input, temperature, tint] diff --git a/addons/ShaderLib/Artistic/Adjustment/WhiteBalance.gdshaderinc b/addons/ShaderLib/Artistic/Adjustment/WhiteBalance.gdshaderinc new file mode 100644 index 0000000..727e73a --- /dev/null +++ b/addons/ShaderLib/Artistic/Adjustment/WhiteBalance.gdshaderinc @@ -0,0 +1,36 @@ +vec3 white_balance(vec3 input, float temperature, float tint){ + float t1 = temperature * 10.0 / 6.0; + float t2 = tint * 10.0 / 6.0; + + float x = 0.31271 - t1 * (t1 < 0.0 ? 0.1 : 0.05); + float standard_illuminant_y = 2.87 * x - 3.0 * x * x - 0.27509507; + float y = standard_illuminant_y + t2 * 0.05; + + vec3 w1 = vec3(0.949237, 1.03542, 1.08728); + + 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; + vec3 w2 = vec3(L, M, S); + + vec3 balance = vec3(w1.x / w2.x, w1.y / w2.y, w1.z / w2.z); + + mat3 LIN_2_LMS_MAT = mat3( + vec3(3.90405e-1, 5.49941e-1, 8.92632e-3), + vec3(7.08416e-2, 9.63172e-1, 1.35775e-3), + vec3(2.31082e-2, 1.28021e-1, 9.36245e-1) + ); + + mat3 LMS_2_LIN_MAT = mat3( + vec3(2.85847, -1.62879, -2.48910), + vec3(-2.10182e-1, 1.15820e+0, 3.24281e-4), + vec3(-4.18120e-2, -1.18169e-1, 1.06867e+0) + ); + + vec3 lms = LIN_2_LMS_MAT * input; + lms *= balance; + return LMS_2_LIN_MAT * lms; +} \ No newline at end of file diff --git a/documentation/Documentation.md b/documentation/Documentation.md index 1e9cdaf..0d01933 100644 --- a/documentation/Documentation.md +++ b/documentation/Documentation.md @@ -13,6 +13,7 @@ Delete the contents of **_addons/ShaderLib_** folder from your project. Make sur