99 lines
3.0 KiB
GLSL
99 lines
3.0 KiB
GLSL
#version 330 core
|
|
|
|
in vec2 uv;
|
|
out vec4 outColor;
|
|
|
|
uniform sampler2D Shader1Texture;
|
|
uniform sampler2D Shader2Texture;
|
|
uniform sampler2D DepthTexture;
|
|
uniform int blendMode; // 0=Mix, 1=Add, 2=Multiply, 3=Screen, 4=Overlay, 5=Difference
|
|
uniform float blendIntensity;
|
|
uniform float shader1Strength;
|
|
uniform float shader2Strength;
|
|
|
|
// Mix blend mode
|
|
vec3 blendMix(vec3 base, vec3 blend, float intensity) {
|
|
return mix(base, blend, intensity);
|
|
}
|
|
|
|
// Add blend mode
|
|
vec3 blendAdd(vec3 base, vec3 blend) {
|
|
return min(base + blend, vec3(1.0));
|
|
}
|
|
|
|
// Multiply blend mode
|
|
vec3 blendMultiply(vec3 base, vec3 blend) {
|
|
return base * blend;
|
|
}
|
|
|
|
// Screen blend mode
|
|
vec3 blendScreen(vec3 base, vec3 blend) {
|
|
return vec3(1.0) - (vec3(1.0) - base) * (vec3(1.0) - blend);
|
|
}
|
|
|
|
// Overlay blend mode
|
|
vec3 blendOverlay(vec3 base, vec3 blend) {
|
|
vec3 result;
|
|
result.r = base.r < 0.5 ? (2.0 * base.r * blend.r) : (1.0 - 2.0 * (1.0 - base.r) * (1.0 - blend.r));
|
|
result.g = base.g < 0.5 ? (2.0 * base.g * blend.g) : (1.0 - 2.0 * (1.0 - base.g) * (1.0 - blend.g));
|
|
result.b = base.b < 0.5 ? (2.0 * base.b * blend.b) : (1.0 - 2.0 * (1.0 - base.b) * (1.0 - blend.b));
|
|
return result;
|
|
}
|
|
|
|
// Difference blend mode
|
|
vec3 blendDifference(vec3 base, vec3 blend) {
|
|
return abs(base - blend);
|
|
}
|
|
|
|
void main() {
|
|
vec4 shader1Color = texture(Shader1Texture, uv);
|
|
vec4 shader2Color = texture(Shader2Texture, uv);
|
|
|
|
// Optimized depth mask - cross pattern
|
|
vec2 texelSize = 1.0 / textureSize(DepthTexture, 0);
|
|
float centerDepth = texture(DepthTexture, uv).r;
|
|
float minDepth = centerDepth;
|
|
|
|
minDepth = min(minDepth, texture(DepthTexture, uv + vec2(-texelSize.x, 0.0)).r);
|
|
minDepth = min(minDepth, texture(DepthTexture, uv + vec2(texelSize.x, 0.0)).r);
|
|
minDepth = min(minDepth, texture(DepthTexture, uv + vec2(0.0, -texelSize.y)).r);
|
|
minDepth = min(minDepth, texture(DepthTexture, uv + vec2(0.0, texelSize.y)).r);
|
|
|
|
float mask = smoothstep(0.99, 0.98, minDepth);
|
|
|
|
if (mask < 0.01) {
|
|
discard;
|
|
}
|
|
|
|
// Apply strength modifiers
|
|
vec3 color1 = shader1Color.rgb * shader1Strength;
|
|
vec3 color2 = shader2Color.rgb * shader2Strength;
|
|
|
|
// Apply blend mode
|
|
vec3 blendedColor;
|
|
|
|
if (blendMode == 0) {
|
|
// Mix
|
|
blendedColor = blendMix(color1, color2, blendIntensity);
|
|
} else if (blendMode == 1) {
|
|
// Add
|
|
blendedColor = mix(color1, blendAdd(color1, color2), blendIntensity);
|
|
} else if (blendMode == 2) {
|
|
// Multiply
|
|
blendedColor = mix(color1, blendMultiply(color1, color2), blendIntensity);
|
|
} else if (blendMode == 3) {
|
|
// Screen
|
|
blendedColor = mix(color1, blendScreen(color1, color2), blendIntensity);
|
|
} else if (blendMode == 4) {
|
|
// Overlay
|
|
blendedColor = mix(color1, blendOverlay(color1, color2), blendIntensity);
|
|
} else if (blendMode == 5) {
|
|
// Difference
|
|
blendedColor = mix(color1, blendDifference(color1, color2), blendIntensity);
|
|
} else {
|
|
blendedColor = color1;
|
|
}
|
|
|
|
outColor = vec4(blendedColor, mask);
|
|
}
|