add bsnes-gamma shader. fixes #2942

This commit is contained in:
zeromus 2021-09-27 22:30:57 -04:00
parent 4303d1c333
commit e18dd99a58
3 changed files with 95 additions and 0 deletions

View File

@ -0,0 +1,4 @@
shaders = 1
shader0 = bsnes-gamma.cg
scale0 = 2

View File

@ -0,0 +1,47 @@
//https://raw.githubusercontent.com/Themaister/Emulator-Shader-Pack/master/Cg/TV/gamma.cg
/*
Author: Themaister
License: Public domain
*/
// Shader that replicates gamma-ramp of bSNES/Higan.
#ifdef VERTEX
uniform mat4 modelViewProj;
void main()
{
gl_Position = modelViewProj * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
#endif
#ifdef FRAGMENT
uniform sampler2D s_p;
// Tweakables.
#define saturation 1.0
#define gamma 1.5
#define luminance 1.0
vec3 grayscale(vec3 col)
{
// Non-conventional way to do grayscale,
// but bSNES uses this as grayscale value.
float v = dot(col, vec3(0.3333,0.3333,0.3333));
return vec3(v,v,v);
}
void main()
{
vec3 res = texture2D(s_p,gl_TexCoord[0].xy).xyz;
res = mix(grayscale(res), res, saturation); // Apply saturation
res = pow(res, vec3(gamma,gamma,gamma)); // Apply gamma
gl_FragColor = vec4(clamp(res * luminance,0.0,1.0), 1.0);
}
#endif

View File

@ -0,0 +1,44 @@
//https://raw.githubusercontent.com/Themaister/Emulator-Shader-Pack/master/Cg/TV/gamma.cg
/*
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.
#define saturation 1.0
#define gamma 1.5
#define luminance 1.0
float3 grayscale(float3 col)
{
// Non-conventional way to do grayscale,
// but bSNES uses this as grayscale value.
float v = dot(col, float3(0.3333,0.3333,0.3333));
return float3(v,v,v);
}
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,gamma,gamma)); // Apply gamma
return float4(saturate(res * luminance), 1.0);
}