From 971a9f089d94210b18760223144368da9918cac4 Mon Sep 17 00:00:00 2001 From: themancalledjakob Date: Thu, 6 Apr 2023 11:16:06 +0200 Subject: [PATCH] adjust shaders --- data/ofxMsdfgen/shaders/mix/ES2/shader.frag | 20 ++++----- data/ofxMsdfgen/shaders/mix/GL2/shader.frag | 14 +++--- data/ofxMsdfgen/shaders/mix/GL3/shader.frag | 48 +++++++++++++++------ 3 files changed, 50 insertions(+), 32 deletions(-) diff --git a/data/ofxMsdfgen/shaders/mix/ES2/shader.frag b/data/ofxMsdfgen/shaders/mix/ES2/shader.frag index d509ed2..e6fe164 100644 --- a/data/ofxMsdfgen/shaders/mix/ES2/shader.frag +++ b/data/ofxMsdfgen/shaders/mix/ES2/shader.frag @@ -1,12 +1,10 @@ precision highp float; // these are our textures -uniform sampler2D msdf_0; -uniform sampler2D msdf_1; +uniform sampler2D msdf; uniform vec4 fontColor; -uniform float msdf_mix; -uniform float msdf_pxratio; +uniform float pxRange; // this comes from the vertex shader varying vec2 texCoordVarying; @@ -15,8 +13,10 @@ float median(float r, float g, float b) { return max(min(r, g), min(max(r, g), b)); } -float screenPxRange(float ratio) { - return ratio * 2.0; +float screenPxRange() { + vec2 unitRange = vec2(pxRange)/vec2(textureSize(msdf)); + vec2 screenTexSize = vec2(1.0)/fwidth(texCoordVarying); + return max(0.5*dot(unitRange, screenTexSize), 1.0); } void main() @@ -24,11 +24,9 @@ void main() vec4 bgColor = vec4(fontColor.rgb,0); vec4 fgColor = fontColor; - vec3 msd_0 = texture2D(msdf_0, texCoordVarying).rgb; - vec3 msd_1 = texture2D(msdf_1, texCoordVarying).rgb; - vec3 msd = mix(msd_0, msd_1,msdf_mix); - float sd = median(msd.r, msd.g, msd.b); - float screenPxDistance = screenPxRange(msdf_pxratio)*(sd - 0.5); + vec3 msdf_rgb = texture2D(msdf, texCoordVarying).rgb; + float sd = median(msdf_rgb.r, msdf_rgb.g, msdf_rgb.b); + float screenPxDistance = screenPxRange()*(sd - 0.5); float opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0); gl_FragColor = mix(bgColor, fgColor, opacity); } diff --git a/data/ofxMsdfgen/shaders/mix/GL2/shader.frag b/data/ofxMsdfgen/shaders/mix/GL2/shader.frag index 2226d46..0ecf284 100644 --- a/data/ofxMsdfgen/shaders/mix/GL2/shader.frag +++ b/data/ofxMsdfgen/shaders/mix/GL2/shader.frag @@ -3,11 +3,9 @@ precision highp float; // these are our textures uniform sampler2DRect msdf_0; -uniform sampler2DRect msdf_1; uniform vec4 fontColor; -uniform float msdf_mix; -uniform float msdf_pxratio; +uniform float pxRange; // this comes from the vertex shader varying vec2 texCoordVarying; @@ -17,7 +15,9 @@ float median(float r, float g, float b) { } float screenPxRange() { - return 2.0; + vec2 unitRange = vec2(pxRange)/vec2(textureSize(msdf)); + vec2 screenTexSize = vec2(1.0)/fwidth(texCoordVarying); + return max(0.5*dot(unitRange, screenTexSize), 1.0); } void main() @@ -25,10 +25,8 @@ void main() vec4 bgColor = vec4(fontColor.rgb,0); vec4 fgColor = fontColor; - vec3 msd_0 = texture2DRect(msdf_0, texCoordVarying).rgb; - vec3 msd_1 = texture2DRect(msdf_1, texCoordVarying).rgb; - vec3 msd = mix(msd_0, msd_1,msdf_mix); - float sd = median(msd.r, msd.g, msd.b); + vec3 msdf_rgb = texture2DRect(msdf, texCoordVarying).rgb; + float sd = median(msdf_rgb.r, msdf_rgb.g, msdf_rgb.b); float screenPxDistance = screenPxRange()*(sd - 0.5); float opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0); gl_FragColor = mix(bgColor, fgColor, opacity); diff --git a/data/ofxMsdfgen/shaders/mix/GL3/shader.frag b/data/ofxMsdfgen/shaders/mix/GL3/shader.frag index 4e8edc0..519a4e9 100644 --- a/data/ofxMsdfgen/shaders/mix/GL3/shader.frag +++ b/data/ofxMsdfgen/shaders/mix/GL3/shader.frag @@ -2,12 +2,15 @@ precision highp float; // these are our textures -uniform sampler2DRect msdf_0; -uniform sampler2DRect msdf_1; +uniform sampler2DRect msdf; uniform vec4 fontColor; +uniform vec2 unitRange; uniform float msdf_mix; -uniform float msdf_pxratio; +uniform vec2 translation_a; +uniform vec2 scale_a; +uniform vec2 translation_b; +uniform vec2 scale_b; // this comes from the vertex shader in vec2 texCoordVarying; @@ -19,20 +22,39 @@ float median(float r, float g, float b) { return max(min(r, g), min(max(r, g), b)); } -float screenPxRange(float ratio) { - return ratio * 2.0; +float screenPxRange() { + //vec2 unitRange = vec2(pxRange)/vec2(textureSize(msdf)); + vec2 screenTexSize = vec2(1.0)/fwidth(texCoordVarying); + return max(0.5*dot(unitRange, screenTexSize), 1.0); +} + +float screenPxDistance(vec3 msdf_rgb) { + float sd = median(msdf_rgb.r, msdf_rgb.g, msdf_rgb.b); + return screenPxRange()*(sd - 0.5); } void main() { - vec4 bgColor = vec4(fontColor.rgb,0); + vec4 bgColor = vec4(fontColor.rgb,0.0); vec4 fgColor = fontColor; - vec3 msd_0 = texture(msdf_0, texCoordVarying).rgb; - vec3 msd_1 = texture(msdf_1, texCoordVarying).rgb; - vec3 msd = mix(msd_0, msd_1,msdf_mix); - float sd = median(msd.r, msd.g, msd.b); - float screenPxDistance = screenPxRange(msdf_pxratio)*(sd - 0.5); - float opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0); - outputColor = mix(bgColor, fgColor, opacity); + vec2 texCoord_a = (texCoordVarying * scale_a) + translation_a; + vec2 texCoord_b = (texCoordVarying * scale_b) + translation_b; + + vec3 msdf_rgb_total = texture(msdf, texCoordVarying).rgb; + vec3 msdf_rgb_a = texture(msdf, texCoord_a).rgb; + vec3 msdf_rgb_b = texture(msdf, texCoord_b).rgb; + float screenPxDistance_a = screenPxDistance(msdf_rgb_a); + float screenPxDistance_b = screenPxDistance(msdf_rgb_b); + float screenPxDistance_mix = mix(screenPxDistance_a, screenPxDistance_b, msdf_mix); + + float opacity = clamp(screenPxDistance_mix + 0.5, 0.0, 1.0); + + if (opacity < 0.5) + discard; + outputColor = vec4(vec3(fgColor),1.0); //mix(bgColor, fgColor, opacity); + + //outputColor = vec4(opacity, 1.0-opacity, 0.0, 1.0); + //outputColor = vec4(1.0-msdf_rgb.rgb, 1.0); + //outputColor = vec4(1.0,0.0,1.0,1.0); }