mirror of
https://github.com/libretro/glsl-shaders.git
synced 2026-11-07 10:36:01 -10:00
Update sgenpt-mix to v10 (#501)
* Update sgenpt-mix to v10 - Update to the same slang single pass version. * Use COMPAT_TEXTURE in sgenpt-mix - Updated as requested.
This commit is contained in:
1 parent
3bf697d762
commit
d1eefcefcc
1 file changed
+73
-96
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
SGENPT-MIX - Sega Genesis Pseudo Transparency Mixer Shader - v8b
|
||||
SGENPT-MIX - Sega Genesis Pseudo Transparency Mixer Shader - v10
|
||||
|
||||
2011-2020 Hyllian - [email protected]
|
||||
2011-2024 Hyllian - [email protected]
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -23,24 +23,22 @@
|
||||
|
||||
*/
|
||||
|
||||
#pragma parameter SGPT_BLEND_OPTION "0.OFF | 1.VL | 2.CB | 3.CB-S | 4.Both | 5.Both2 | 6.Both-S" 4.0 0.0 6.0 1.0
|
||||
#pragma parameter SGPT_BLEND_LEVEL "SGENPT-MIX Both Blend Level" 1.0 0.0 1.0 0.1
|
||||
#pragma parameter SGPT_ADJUST_VIEW "SGENPT-MIX Adjust View" 0.0 0.0 1.0 1.0
|
||||
#pragma parameter SGPT_LINEAR_GAMMA "SGENPT-MIX Use Linear Gamma" 1.0 0.0 1.0 1.0
|
||||
|
||||
|
||||
#define texCoord TEX0
|
||||
#pragma parameter SGPT_NONONO "SGENPT-MIX v10:" 0.0 0.0 1.0 1.0
|
||||
#pragma parameter SGPT_BLEND_OPTION " 0: OFF | 1: VL+CB | 2: VL | 3: CB" 1.0 0.0 3.0 1.0
|
||||
#pragma parameter SGPT_BLEND_LEVEL " Blend Level" 0.85 0.0 1.0 0.05
|
||||
#pragma parameter SGPT_ADJUST_VIEW " Adjust View" 0.0 0.0 1.0 1.0
|
||||
#pragma parameter SGPT_LINEAR_GAMMA " Use Linear Gamma" 1.0 0.0 1.0 1.0
|
||||
|
||||
#if defined(VERTEX)
|
||||
|
||||
#if __VERSION__ >= 130
|
||||
#define OUT out
|
||||
#define IN in
|
||||
#define tex2D texture
|
||||
#define COMPAT_VARYING out
|
||||
#define COMPAT_ATTRIBUTE in
|
||||
#define COMPAT_TEXTURE texture
|
||||
#else
|
||||
#define OUT varying
|
||||
#define IN attribute
|
||||
#define tex2D texture2D
|
||||
#define COMPAT_VARYING varying
|
||||
#define COMPAT_ATTRIBUTE attribute
|
||||
#define COMPAT_TEXTURE texture2D
|
||||
#endif
|
||||
|
||||
#ifdef GL_ES
|
||||
@@ -49,37 +47,41 @@
|
||||
#define COMPAT_PRECISION
|
||||
#endif
|
||||
|
||||
|
||||
IN vec4 VertexCoord;
|
||||
IN vec4 Color;
|
||||
IN vec2 TexCoord;
|
||||
OUT vec4 color;
|
||||
OUT vec2 texCoord;
|
||||
COMPAT_ATTRIBUTE vec4 VertexCoord;
|
||||
COMPAT_ATTRIBUTE vec4 COLOR;
|
||||
COMPAT_ATTRIBUTE vec4 TexCoord;
|
||||
COMPAT_VARYING vec4 COL0;
|
||||
COMPAT_VARYING vec4 TEX0;
|
||||
|
||||
uniform mat4 MVPMatrix;
|
||||
uniform COMPAT_PRECISION int FrameDirection;
|
||||
uniform COMPAT_PRECISION int FrameCount;
|
||||
uniform COMPAT_PRECISION int FrameDirection;
|
||||
uniform COMPAT_PRECISION int FrameCount;
|
||||
uniform COMPAT_PRECISION vec2 OutputSize;
|
||||
uniform COMPAT_PRECISION vec2 TextureSize;
|
||||
uniform COMPAT_PRECISION vec2 InputSize;
|
||||
|
||||
// vertex compatibility #defines
|
||||
#define vTexCoord TEX0.xy
|
||||
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
|
||||
#define outsize vec4(OutputSize, 1.0 / OutputSize)
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = MVPMatrix * VertexCoord;
|
||||
color = Color;
|
||||
texCoord = TexCoord;
|
||||
COL0 = COLOR;
|
||||
TEX0.xy = TexCoord.xy;
|
||||
}
|
||||
|
||||
#elif defined(FRAGMENT)
|
||||
|
||||
#if __VERSION__ >= 130
|
||||
#define IN in
|
||||
#define tex2D texture
|
||||
#define COMPAT_VARYING in
|
||||
#define COMPAT_TEXTURE texture
|
||||
out vec4 FragColor;
|
||||
#else
|
||||
#define IN varying
|
||||
#define COMPAT_VARYING varying
|
||||
#define FragColor gl_FragColor
|
||||
#define tex2D texture2D
|
||||
#define COMPAT_TEXTURE texture2D
|
||||
#endif
|
||||
|
||||
#ifdef GL_ES
|
||||
@@ -98,8 +100,15 @@ uniform COMPAT_PRECISION int FrameCount;
|
||||
uniform COMPAT_PRECISION vec2 OutputSize;
|
||||
uniform COMPAT_PRECISION vec2 TextureSize;
|
||||
uniform COMPAT_PRECISION vec2 InputSize;
|
||||
uniform sampler2D s_p;
|
||||
IN vec2 texCoord;
|
||||
uniform sampler2D Texture;
|
||||
COMPAT_VARYING vec4 TEX0;
|
||||
|
||||
// fragment compatibility #defines
|
||||
#define Source Texture
|
||||
#define vTexCoord TEX0.xy
|
||||
|
||||
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
|
||||
#define outsize vec4(OutputSize, 1.0 / OutputSize)
|
||||
|
||||
#ifdef PARAMETER_UNIFORM
|
||||
uniform COMPAT_PRECISION float SGPT_BLEND_OPTION;
|
||||
@@ -113,98 +122,66 @@ uniform COMPAT_PRECISION float SGPT_LINEAR_GAMMA;
|
||||
#define SGPT_LINEAR_GAMMA 1.0
|
||||
#endif
|
||||
|
||||
|
||||
#define GAMMA_EXP (SGPT_LINEAR_GAMMA+1.0)
|
||||
#define GAMMA_IN(color) pow(color, vec3(GAMMA_EXP, GAMMA_EXP, GAMMA_EXP))
|
||||
#define GAMMA_OUT(color) pow(color, vec3(1.0 / GAMMA_EXP, 1.0 / GAMMA_EXP, 1.0 / GAMMA_EXP))
|
||||
|
||||
|
||||
const vec3 Y = vec3(.2126, .7152, .0722);
|
||||
const vec3 Y = vec3( 0.299, 0.587, 0.114);
|
||||
|
||||
vec3 min_s(vec3 central, vec3 adj1, vec3 adj2) {return min(central, max(adj1, adj2));}
|
||||
vec3 max_s(vec3 central, vec3 adj1, vec3 adj2) {return max(central, min(adj1, adj2));}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 dx = vec2(1.0, 0.0)/TextureSize;
|
||||
vec2 dy = vec2(0.0, 1.0)/TextureSize;
|
||||
vec2 dx = vec2(1.0, 0.0)/SourceSize.xy;
|
||||
vec2 dy = vec2(0.0, 1.0)/SourceSize.xy;
|
||||
|
||||
// Reading the texels.
|
||||
vec3 C = GAMMA_IN(tex2D(s_p, texCoord ).xyz);
|
||||
vec3 L = GAMMA_IN(tex2D(s_p, texCoord -dx).xyz);
|
||||
vec3 R = GAMMA_IN(tex2D(s_p, texCoord +dx).xyz);
|
||||
vec3 U = GAMMA_IN(tex2D(s_p, texCoord -dy).xyz);
|
||||
vec3 D = GAMMA_IN(tex2D(s_p, texCoord +dy).xyz);
|
||||
vec3 UL = GAMMA_IN(tex2D(s_p, texCoord -dx -dy).xyz);
|
||||
vec3 UR = GAMMA_IN(tex2D(s_p, texCoord +dx -dy).xyz);
|
||||
vec3 DL = GAMMA_IN(tex2D(s_p, texCoord -dx +dy).xyz);
|
||||
vec3 DR = GAMMA_IN(tex2D(s_p, texCoord +dx +dy).xyz);
|
||||
|
||||
vec3 color = C;
|
||||
vec3 C = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord ).xyz);
|
||||
vec3 L = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord -dx).xyz);
|
||||
vec3 R = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord +dx).xyz);
|
||||
|
||||
// Get min/max samples
|
||||
vec3 min_sample = min_s(C, L, R);
|
||||
vec3 max_sample = max_s(C, L, R);
|
||||
|
||||
float diff = dot(max(max(C, L), max(C, R)) - min(min(C, L), min(C, R)), Y);
|
||||
float contrast = dot(max(C, max(L, R)) - min(C, min(L, R)), Y);
|
||||
|
||||
if (int(SGPT_BLEND_OPTION) == 1) // Only Vertical Lines
|
||||
contrast = smoothstep(0.0, 1.0, (1.0 - SGPT_BLEND_LEVEL) * contrast);
|
||||
|
||||
if (int(SGPT_BLEND_OPTION) == 2) // Only Vertical Lines
|
||||
{
|
||||
vec3 UL = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord -dx -dy).xyz);
|
||||
vec3 UR = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord +dx -dy).xyz);
|
||||
vec3 DL = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord -dx +dy).xyz);
|
||||
vec3 DR = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord +dx +dy).xyz);
|
||||
|
||||
min_sample = max_s(min_sample, min_s(C, DL, DR), min_s(C, UL, UR));
|
||||
max_sample = min_s(max_sample, max_s(C, DL, DR), max_s(C, UL, UR));
|
||||
|
||||
diff *= (1.0 - SGPT_BLEND_LEVEL);
|
||||
|
||||
color = 0.5*( 1.0 + diff )*C + 0.25*( 1.0 - diff )*(L + R);
|
||||
}
|
||||
else if (int(SGPT_BLEND_OPTION) == 2) // Only Checkerboard
|
||||
else if (int(SGPT_BLEND_OPTION) == 3) // Only Checkerboard
|
||||
{
|
||||
vec3 U = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord -dy).xyz);
|
||||
vec3 D = GAMMA_IN(COMPAT_TEXTURE(Source, vTexCoord +dy).xyz);
|
||||
|
||||
min_sample = max(min_sample, min_s(C, U, D));
|
||||
max_sample = min(max_sample, max_s(C, U, D));
|
||||
|
||||
diff *= (1.0 - SGPT_BLEND_LEVEL);
|
||||
|
||||
color = 0.5*( 1.0 + diff )*C + 0.125*( 1.0 - diff )*(L + R + U + D);
|
||||
}
|
||||
else if (int(SGPT_BLEND_OPTION) == 3) // Only Checkerboard - Soft
|
||||
{
|
||||
min_sample = min_s(min_sample, U, D);
|
||||
max_sample = max_s(max_sample, U, D);
|
||||
|
||||
diff *= (1.0 - SGPT_BLEND_LEVEL);
|
||||
|
||||
color = 0.5*( 1.0 + diff )*C + 0.125*( 1.0 - diff )*(L + R + U + D);
|
||||
}
|
||||
else if (int(SGPT_BLEND_OPTION) == 4) // VL-CB
|
||||
{
|
||||
diff *= (1.0 - SGPT_BLEND_LEVEL);
|
||||
|
||||
color = 0.5*( 1.0 + diff )*C + 0.25*( 1.0 - diff )*(L + R);
|
||||
}
|
||||
else if (int(SGPT_BLEND_OPTION) == 5) // VL-CB-2
|
||||
{
|
||||
min_sample = min_s(min_sample, U, D);
|
||||
max_sample = max_s(max_sample, U, D);
|
||||
|
||||
diff *= (1.0 - SGPT_BLEND_LEVEL);
|
||||
|
||||
color = 0.5*( 1.0 + diff )*C + 0.25*( 1.0 - diff )*(L + R);
|
||||
}
|
||||
else if (int(SGPT_BLEND_OPTION) == 6) // VL-CB-Soft
|
||||
{
|
||||
min_sample = min(min_sample, min(min_s(D, DL, DR), min_s(U, UL, UR)));
|
||||
max_sample = max(max_sample, max(max_s(D, DL, DR), max_s(U, UL, UR)));
|
||||
|
||||
diff *= (1.0 - SGPT_BLEND_LEVEL);
|
||||
|
||||
color = 0.5*( 1.0 + diff )*C + 0.25*( 1.0 - diff )*(L + R);
|
||||
}
|
||||
|
||||
color = clamp(color, min_sample, max_sample);
|
||||
vec3 col_L = 0.5*( C + L + contrast*( C - L ));
|
||||
vec3 col_R = 0.5*( C + R + contrast*( C - R ));
|
||||
|
||||
color = mix(color, vec3(dot(abs(C-color), vec3(1.0, 1.0, 1.0))), SGPT_ADJUST_VIEW);
|
||||
float contrast_L = dot(abs(C - col_L), Y);
|
||||
float contrast_R = dot(abs(C - col_R), Y);
|
||||
|
||||
FragColor.xyz = GAMMA_OUT(color);
|
||||
}
|
||||
// Choose smaller contrast
|
||||
vec3 color = contrast_R < contrast_L ? col_R : col_L;
|
||||
|
||||
color = SGPT_BLEND_OPTION > 0.5 ? clamp(color, min_sample, max_sample) : C;
|
||||
|
||||
color = SGPT_ADJUST_VIEW > 0.5 ? vec3(dot(abs(C-color), vec3(1.0, 1.0, 1.0))) : color;
|
||||
|
||||
FragColor = vec4(GAMMA_OUT(color), 1.0);
|
||||
|
||||
}
|
||||
#endif
|
||||
Reference in new issue
Block a user