diff --git a/res/shaders/customLCD.shader/ags001-light.fs b/res/shaders/customLCD.shader/ags001-light.fs new file mode 100644 index 00000000000..9cd6c74781a --- /dev/null +++ b/res/shaders/customLCD.shader/ags001-light.fs @@ -0,0 +1,36 @@ +varying vec2 texCoord; +uniform sampler2D tex; +uniform int enable; +uniform float reflectionBrightness; +uniform vec2 reflectionDistance; +uniform float lightBrightness; + +const float speed = 2.0; +const float decay = 2.0; +const float coeff = 2.5; + +void main() { + if(enable==1) + { + float sp = pow(speed, lightBrightness); + float dc = pow(decay, -lightBrightness); + float s = (sp - dc) / (sp + dc); + vec2 radius = (texCoord.st - vec2(0.5, 0.5)) * vec2(coeff * s); + radius = pow(abs(radius), vec2(4.0)); + vec3 bleed = vec3(0.12, 0.14, 0.19); + bleed += (dot(radius, radius) + vec3(0.02, 0.03, 0.05)) * vec3(0.14, 0.18, 0.2); + + vec4 color = texture2D(tex, texCoord); + color.rgb += pow(bleed, pow(vec3(lightBrightness), vec3(-0.5))); + + vec4 reflection = texture2D(tex, texCoord - reflectionDistance); + color.rgb += reflection.rgb * reflectionBrightness; + color.a = 1.0; + gl_FragColor = color; + } + else + { + vec4 color = texture2D(tex, texCoord); + gl_FragColor = color; + } +} diff --git a/res/shaders/customLCD.shader/customLCD-pixelBounds.fs b/res/shaders/customLCD.shader/customLCD-pixelBounds.fs new file mode 100644 index 00000000000..8ec47b71b81 --- /dev/null +++ b/res/shaders/customLCD.shader/customLCD-pixelBounds.fs @@ -0,0 +1,14 @@ +varying vec2 texCoord; +uniform sampler2D tex; +uniform vec2 texSize; +uniform float boundBrightness; + +void main() { + vec4 color = texture2D(tex, texCoord); + if (int(mod(texCoord.s * texSize.x * 6.0, 6.0)) == 5 || + int(mod(texCoord.t * texSize.y * 6.0, 6.0)) == 5) + { + color.rgb *= vec3(1.0, 1.0, 1.0) * boundBrightness; + } + gl_FragColor = color; +} \ No newline at end of file diff --git a/res/shaders/customLCD.shader/customLCD-subPixels.fs b/res/shaders/customLCD.shader/customLCD-subPixels.fs new file mode 100644 index 00000000000..fab570d7135 --- /dev/null +++ b/res/shaders/customLCD.shader/customLCD-subPixels.fs @@ -0,0 +1,17 @@ +varying vec2 texCoord; +uniform sampler2D tex; +uniform vec2 texSize; +uniform float brightness; +uniform float subPixelDimming; + +void main() { + vec4 color = texture2D(tex, texCoord); + vec3 subPixels[3]; + float subPixelDimming = 1.0 - subPixelDimming; + subPixels[0] = vec3(1.0, subPixelDimming, subPixelDimming); + subPixels[1] = vec3(subPixelDimming, 1.0, subPixelDimming); + subPixels[2] = vec3(subPixelDimming, subPixelDimming, 1.0); + color.rgb *= brightness; + color.rgb *= subPixels[int(mod(texCoord.s * texSize.x * 3.0, 3.0))]; + gl_FragColor = color; +} \ No newline at end of file diff --git a/res/shaders/customLCD.shader/manifest.ini b/res/shaders/customLCD.shader/manifest.ini new file mode 100644 index 00000000000..a05fb029fb7 --- /dev/null +++ b/res/shaders/customLCD.shader/manifest.ini @@ -0,0 +1,59 @@ +[shader] +name=Custom LCD +author=endrift, Dominus Iniquitatis, EddyHg80 +description=Configurable LCD emulation. +passes=3 + +[pass.0] +fragmentShader=customLCD-subPixels.fs +blend=1 +width=-3 +height=-3 + +[pass.0.uniform.brightness] +type=float +default=1.1 +readableName=Brightness + +[pass.0.uniform.subPixelDimming] +type=float +default=0.2 +readableName=Sub pixel dimming + +[pass.1] +fragmentShader=customLCD-pixelBounds.fs +blend=1 +width=-6 +height=-6 + +[pass.1.uniform.boundBrightness] +type=float +default=0.9 +readableName=Pixel bound brightness + +[pass.2] +fragmentShader=ags001-light.fs +blend=1 +width=-6 +height=-6 + +[pass.2.uniform.enable] +type=int +default=0 +readableName=Enable AGS-001's pristine light and reflections + +[pass.2.uniform.lightBrightness] +type=float +default=0.9 +readableName=Light brightness + +[pass.2.uniform.reflectionBrightness] +type=float +default=0.07 +readableName=Reflection brightness + +[pass.2.uniform.reflectionDistance] +type=float2 +default[0]=0 +default[1]=0.025 +readableName=Reflection offset (x|y)