/* Author: Themaister License: Public domain */ // Shader that replicates gamma-ramp of bSNES/Higan. void main_vertex ( float4 position : POSITION, out float4 oPosition : POSITION, uniform float4x4 modelViewProj, float2 tex : TEXCOORD, out float2 oTex : TEXCOORD ) { oPosition = mul(modelViewProj, position); oTex = tex; } // Tweakables. const float saturation = 1.0; const float gamma = 1.5; const float luminance = 1.0; float3 grayscale(float3 col) { // Non-conventional way to do grayscale, // but bSNES uses this as grayscale value. return float3(dot(col, float3(0.3333))); } float4 main_fragment(float2 tex : TEXCOORD, uniform sampler2D s0 : TEXUNIT0) : COLOR { float3 res = tex2D(s0, tex).xyz; res = lerp(grayscale(res), res, saturation); // Apply saturation res = pow(res, float3(gamma)); // Apply gamma return float4(saturate(res * luminance), 1.0); }