// SPDX-License-Identifier: MIT // // EmulationStation Desktop Edition // core.glsl // // Core shader functionality: // opacity, saturation, dimming and BGRA to RGBA conversion. // #if defined(VERTEX) // Vertex section of code: #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform mat4 MVPMatrix; COMPAT_ATTRIBUTE vec2 positionAttrib; COMPAT_ATTRIBUTE vec2 TexCoord; COMPAT_ATTRIBUTE vec4 colorAttrib; COMPAT_VARYING vec4 color; COMPAT_VARYING vec2 texCoord; void main(void) { color.rgba = colorAttrib.abgr; texCoord = TexCoord; gl_Position = MVPMatrix * vec4(positionAttrib.xy, 0.0, 1.0); } #elif defined(FRAGMENT) // Fragment section of code: #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out COMPAT_PRECISION vec4 FragColor; #else #define COMPAT_VARYING varying #define COMPAT_TEXTURE texture2D #define FragColor gl_FragColor #endif COMPAT_VARYING COMPAT_PRECISION vec4 color; COMPAT_VARYING COMPAT_PRECISION vec4 color2; COMPAT_VARYING COMPAT_PRECISION vec2 texCoord; uniform COMPAT_PRECISION float opacity; uniform COMPAT_PRECISION float saturation; uniform COMPAT_PRECISION float dimming; uniform unsigned int shaderFlags; uniform sampler2D textureSampler; // shaderFlags: // 0x00000001 - BGRA to RGBA conversion // 0x00000002 - Font texture // 0x00000004 - Post processing void main() { COMPAT_PRECISION vec4 sampledColor = COMPAT_TEXTURE(textureSampler, texCoord); // For fonts the alpha information is stored in the red channel. if (0u != (shaderFlags & 2u)) sampledColor = vec4(1.0f, 1.0f, 1.0f, sampledColor.r); sampledColor *= color; // When post-processing we drop the alpha channel to avoid strange issues // with some graphics drivers. if (0u != (shaderFlags & 4u)) sampledColor.a = 1.0f; // Opacity. if (opacity != 1.0f) sampledColor.a = sampledColor.a * opacity; // Saturation. if (saturation != 1.0f) { COMPAT_PRECISION vec3 grayscale = vec3(dot(sampledColor.rgb, vec3(0.34f, 0.55f, 0.11f))); COMPAT_PRECISION vec3 blendedColor = mix(grayscale, sampledColor.rgb, saturation); sampledColor = vec4(blendedColor, sampledColor.a); } // Dimming if (dimming != 1.0f) { COMPAT_PRECISION vec4 dimColor = vec4(dimming, dimming, dimming, 1.0f); sampledColor *= dimColor; } // BGRA to RGBA conversion. if (0u != (shaderFlags & 1u)) sampledColor = vec4(sampledColor.bgr, sampledColor.a); FragColor = sampledColor; } #endif