bgfx/3rdparty/glsl-optimizer/tests/fragment/z-tonemap-usercurve-inES3.txt
2014-10-11 12:32:43 -07:00

50 lines
1.4 KiB
Plaintext

#version 300 es
#define gl_FragColor _glesFragData[0]
#define gl_FragData _glesFragData
layout(location = 0) out mediump vec4 _glesFragData[4];
struct v2f {
highp vec4 pos;
highp vec2 uv;
};
uniform sampler2D _MainTex;
uniform sampler2D _Curve;
uniform highp float _RangeScale;
highp vec3 FromCIE( in highp vec3 Yxy ) {
highp vec3 XYZ;
XYZ.x = ((Yxy.x * Yxy.y) / Yxy.z);
XYZ.y = Yxy.x;
XYZ.z = ((Yxy.x * ((1.0 - Yxy.y) - Yxy.z)) / Yxy.z);
highp mat3 XYZ2RGB = mat3(2.5651, -1.0217, 0.0753, -1.1665, 1.9777, -0.2543, -0.3986, 0.0439, 1.1892);
return (XYZ2RGB * XYZ);
}
highp vec3 ToCIE( in highp vec3 FullScreenImage ) {
highp mat3 RGB2XYZ = mat3(0.514136, 0.265068, 0.0241188, 0.323879, 0.670234, 0.122818, 0.160364, 0.0640916, 0.844427);
highp vec3 XYZ = (RGB2XYZ * FullScreenImage.xyz);
highp vec3 Yxy;
Yxy.x = XYZ.y;
highp float temp = dot( vec3( 1.0, 1.0, 1.0), XYZ.xyz);
Yxy.yz = (XYZ.xy / temp);
return Yxy;
}
highp vec4 fragCurve( in v2f i ) {
highp vec4 color = texture( _MainTex, i.uv);
highp vec3 cie = ToCIE( color.xyz);
highp float newLum = texture( _Curve, vec2( (cie.x * _RangeScale), 0.5)).x;
cie.x = newLum;
color.xyz = FromCIE( cie);
return color;
}
in highp vec2 xlv_TEXCOORD0;
void main() {
highp vec4 xl_retval;
v2f xlt_i;
xlt_i.pos = vec4(0.0);
xlt_i.uv = vec2(xlv_TEXCOORD0);
xl_retval = fragCurve(xlt_i);
gl_FragData[0] = vec4(xl_retval);
}