// Created using http://en.wikipedia.org/wiki/HLSL2GLSL from our // D3D9 source in gameoverlayrenderer\Shaders\D3D9Overlay.ps // // Translator library functions // float xlat_lib_saturate( float x) { return clamp( x, 0.0, 1.0); } vec2 xlat_lib_saturate( vec2 x) { return clamp( x, 0.0, 1.0); } vec3 xlat_lib_saturate( vec3 x) { return clamp( x, 0.0, 1.0); } vec4 xlat_lib_saturate( vec4 x) { return clamp( x, 0.0, 1.0); } mat2 xlat_lib_saturate(mat2 m) { return mat2( clamp(m[0], 0.0, 1.0), clamp(m[1], 0.0, 1.0)); } mat3 xlat_lib_saturate(mat3 m) { return mat3( clamp(m[0], 0.0, 1.0), clamp(m[1], 0.0, 1.0), clamp(m[2], 0.0, 1.0)); } mat4 xlat_lib_saturate(mat4 m) { return mat4( clamp(m[0], 0.0, 1.0), clamp(m[1], 0.0, 1.0), clamp(m[2], 0.0, 1.0), clamp(m[3], 0.0, 1.0)); } // // Structure definitions // struct RGB_SAMPLE_COORDS { vec2 xy_red; vec2 xy_green; vec2 xy_blue; }; struct PS_OUTPUT { vec4 color; }; struct Fullscreen_Quad_Vert { vec4 position; vec2 texcoord; vec4 color; }; // // Global variable definitions // uniform vec4 P0; uniform float c_rg_to_rb_ratio; uniform vec4 coef; uniform sampler2D filterTex; uniform mat4 invProj; uniform sampler2D mainTex; uniform mat4 rot; uniform vec4 uvOffset; uniform vec4 kernel[2]; // // Function declarations // RGB_SAMPLE_COORDS undistort_coords_from_texture( in vec2 norm01_coord ); vec4 sample_chromatic( in vec2 uv ); vec4 background( in vec3 ray ); vec4 raycast( in vec2 uv ); PS_OUTPUT PSAA( in Fullscreen_Quad_Vert xlat_var_input ); // // Function definitions // RGB_SAMPLE_COORDS undistort_coords_from_texture( in vec2 norm01_coord ) { vec4 distort_samp; RGB_SAMPLE_COORDS samp; distort_samp = texture2D( filterTex, norm01_coord); samp.xy_red = vec2( distort_samp.x , distort_samp.y ); samp.xy_blue = vec2( distort_samp.z , distort_samp.w ); samp.xy_green = (samp.xy_red + (c_rg_to_rb_ratio * (samp.xy_blue - samp.xy_red))); return samp; } vec4 sample_chromatic( in vec2 uv ) { RGB_SAMPLE_COORDS samp; vec4 redsamp; vec4 greensamp; vec4 bluesamp; vec4 color; float threshold; samp = undistort_coords_from_texture( uv); redsamp = raycast( samp.xy_red); greensamp = raycast( samp.xy_green); bluesamp = raycast( samp.xy_blue); color.x = redsamp.x ; color.y = greensamp.y ; color.z = bluesamp.z ; color.w = greensamp.w ; threshold = xlat_lib_saturate( (dot( vec2( lessThan( samp.xy_green, vec2( 0.0100000, 0.0100000)) ), vec2( 1.00000, 1.00000)) + dot( vec2( greaterThan( samp.xy_green, vec2( 0.990000, 0.990000)) ), vec2( 1.00000, 1.00000))) ); return mix( color, vec4( 0.000000, 0.000000, 0.000000, color.w ), vec4( threshold)); } vec4 background( in vec3 ray ) { return vec4( 0.000000, 0.000000, 0.000000, 0.000000); } vec4 raycast( in vec2 uv ) { vec4 ndc; vec4 V; float a; float b; float c; float det; float t; vec3 P; vec2 threshold; vec2 edge; float bg; ndc = vec4( ((2.00000 * uv.x ) - 1.00000), (1.00000 - (2.00000 * uv.y )), 0.000000, 1.00000); ndc = ( invProj * ndc ); ndc /= ndc.w ; ndc.w = 0.000000; V = normalize( ( rot * ndc ) ); a = dot( V.xz , V.xz ); b = (2.00000 * dot( V.xz , P0.xz )); c = (dot( P0.xz , P0.xz ) - P0.w ); det = ((b * b) - ((4.00000 * a) * c)); if ( (det <= 0.000000) ){ return background( V.xyz ); } t = ((sqrt( det ) - b) / (2.00000 * a)); if ( (t <= 0.000000) ){ return background( V.xyz ); } P = (P0.xyz + (V.xyz * t)); P.x = (atan( P.x , ( -P.z )) / coef.x ); P.y *= coef.y ; uv.x = (P.x + 0.500000); uv.y = (0.500000 - P.y ); uv += uvOffset.xy ; uv *= uvOffset.zw ; threshold = vec2( 0.0100000, (0.0100000 * coef.z )); edge = xlat_lib_saturate( (((abs( P.xy ) + threshold) - 0.500000) / threshold) ); bg = dot( edge, edge); return mix( texture2D( mainTex, uv), background( V.xyz ), vec4( bg)); } PS_OUTPUT PSAA( in Fullscreen_Quad_Vert xlat_var_input ) { PS_OUTPUT o; vec4 c1 = sample_chromatic(xlat_var_input.texcoord.xy + kernel[0].xy); vec4 c2 = sample_chromatic(xlat_var_input.texcoord.xy + kernel[0].zw); vec4 c3 = sample_chromatic(xlat_var_input.texcoord.xy + kernel[1].xy); vec4 c4 = sample_chromatic(xlat_var_input.texcoord.xy + kernel[1].zw); o.color = (c1 + c2 + c3 + c4) / 4.0f; o.color *= xlat_var_input.color; return o; } // // User varying // in vec4 xlat_varying_SV_POSITION; // // Translator's entry point // void main() { PS_OUTPUT xlat_retVal; Fullscreen_Quad_Vert xlat_temp_xlat_var_input; xlat_temp_xlat_var_input.position = vec4( xlat_varying_SV_POSITION); xlat_temp_xlat_var_input.texcoord = vec2( gl_TexCoord[0]); xlat_temp_xlat_var_input.color = vec4( gl_Color); xlat_retVal = PSAA( xlat_temp_xlat_var_input); gl_FragData[0] = vec4( xlat_retVal.color); }