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:
Hyllian authored and GitHub committed 2024-12-23 15:49:25 -06:00
1 parent 3bf697d762
commit d1eefcefcc
1 file changed
+73 -96
+73 -96
View File
@@ -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