Revert "White Text Issue: Initial shaders"
This reverts commit eb88b44dbe
.
This commit is contained in:
parent
59fd5830ad
commit
101ff86ec5
2 changed files with 0 additions and 267 deletions
|
@ -1,254 +0,0 @@
|
|||
// -*-C++-*-
|
||||
#version 330
|
||||
#pragma vscode_glsllint_stage : frag
|
||||
|
||||
#pragma import_defines( BACKDROP_COLOR, SHADOW, OUTLINE)
|
||||
#pragma import_defines( SIGNED_DISTANCE_FIELD, TEXTURE_DIMENSION, GLYPH_DIMENSION)
|
||||
|
||||
#if __VERSION__ >= 400
|
||||
#define osg_TextureQueryLOD textureQueryLod
|
||||
#else
|
||||
#extension GL_ARB_texture_query_lod : enable
|
||||
#ifdef GL_ARB_texture_query_lod
|
||||
#define osg_TextureQueryLOD textureQueryLOD
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define TEXTURE texture
|
||||
#define TEXTURELOD textureLod
|
||||
|
||||
#define ALPHA r
|
||||
#define SDF g
|
||||
|
||||
uniform sampler2D glyphTexture;
|
||||
|
||||
in vec2 texCoord;
|
||||
in vec4 vertexColor;
|
||||
|
||||
out vec4 osg_FragColor;
|
||||
|
||||
#ifndef TEXTURE_DIMENSION
|
||||
const float TEXTURE_DIMENSION = 1024.0;
|
||||
#endif
|
||||
|
||||
#ifndef GLYPH_DIMENSION
|
||||
const float GLYPH_DIMENSION = 32.0;
|
||||
#endif
|
||||
|
||||
#ifdef SIGNED_DISTANCE_FIELD
|
||||
|
||||
float distanceFromEdge(vec2 tc)
|
||||
{
|
||||
float center_alpha = TEXTURELOD(glyphTexture, tc, 0.0).SDF;
|
||||
if (center_alpha == 0.0)
|
||||
return -1.0;
|
||||
|
||||
float distance_scale = (1.0 / 6.0) * 1.41;
|
||||
|
||||
return (center_alpha - 0.5) * distance_scale;
|
||||
}
|
||||
|
||||
#ifdef OUTLINE
|
||||
vec2 colorCoeff(float edge_distance, float blend_width, float blend_half_width)
|
||||
{
|
||||
float outline_width = OUTLINE * 0.5;
|
||||
|
||||
if (edge_distance > blend_half_width)
|
||||
return vec2(1.0, 0.0);
|
||||
else if (edge_distance > -blend_half_width)
|
||||
{
|
||||
float f = smoothstep(0.0, 1.0, (blend_half_width - edge_distance) / (blend_width));
|
||||
return vec2(1.0 - f, f);
|
||||
}
|
||||
else if (edge_distance > (blend_half_width - outline_width))
|
||||
return vec2(0.0, 1.0);
|
||||
else if (edge_distance > -(outline_width + blend_half_width))
|
||||
return vec2(0.0, smoothstep(0.0, 1.0, (blend_half_width + outline_width + edge_distance) / blend_width));
|
||||
|
||||
return vec2(0.0, 0.0);
|
||||
}
|
||||
|
||||
#else // OUTLINE
|
||||
|
||||
float colorCoeff(float edge_distance, float blend_width, float blend_half_width)
|
||||
{
|
||||
if (edge_distance > blend_half_width)
|
||||
return 1.0;
|
||||
else if (edge_distance > -blend_half_width)
|
||||
return smoothstep(1.0, 0.0, (blend_half_width - edge_distance) / (blend_width));
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
#endif // OUTLINE
|
||||
|
||||
vec4 textColor(vec2 src_texCoord)
|
||||
{
|
||||
float sample_distance_scale = 0.75;
|
||||
vec2 dx = dFdx(src_texCoord) * sample_distance_scale;
|
||||
vec2 dy = dFdy(src_texCoord) * sample_distance_scale;
|
||||
|
||||
float distance_across_pixel = length(dx + dy) * (TEXTURE_DIMENSION / GLYPH_DIMENSION);
|
||||
|
||||
// compute the appropriate number of samples required to avoid aliasing.
|
||||
int maxNumSamplesAcrossSide = 4;
|
||||
|
||||
int numSamplesX = int(TEXTURE_DIMENSION * length(dx));
|
||||
int numSamplesY = int(TEXTURE_DIMENSION * length(dy));
|
||||
if (numSamplesX < 2)
|
||||
numSamplesX = 2;
|
||||
if (numSamplesY < 2)
|
||||
numSamplesY = 2;
|
||||
if (numSamplesX > maxNumSamplesAcrossSide)
|
||||
numSamplesX = maxNumSamplesAcrossSide;
|
||||
if (numSamplesY > maxNumSamplesAcrossSide)
|
||||
numSamplesY = maxNumSamplesAcrossSide;
|
||||
|
||||
vec2 delta_tx = dx / float(numSamplesX - 1);
|
||||
vec2 delta_ty = dy / float(numSamplesY - 1);
|
||||
|
||||
float numSamples = float(numSamplesX) * float(numSamplesY);
|
||||
float blend_width = 1.5 * distance_across_pixel / numSamples;
|
||||
float blend_half_width = blend_width * 0.5;
|
||||
|
||||
// check whether fragment is wholly within or outwith glyph body+outline
|
||||
float cd = distanceFromEdge(src_texCoord); // central distance (distance from center to edge)
|
||||
if (cd-blend_half_width > distance_across_pixel)
|
||||
return vertexColor; // pixel fully within glyph body
|
||||
|
||||
#ifdef OUTLINE
|
||||
float outline_width = OUTLINE * 0.5;
|
||||
if ((-cd-outline_width - blend_half_width) > distance_across_pixel)
|
||||
return vec4(0.0, 0.0, 0.0, 0.0); // pixel fully outside outline+glyph body
|
||||
vec2 color_coeff = vec2(0.0, 0.0);
|
||||
#else // OUTLINE
|
||||
if (-cd-blend_half_width > distance_across_pixel)
|
||||
return vec4(0.0, 0.0, 0.0, 0.0); // pixel fully outside glyph body
|
||||
float color_coeff = 0.0;
|
||||
#endif // OUTLINE
|
||||
|
||||
// use multi-sampling to provide high quality antialised fragments
|
||||
vec2 origin = src_texCoord - dx * 0.5 - dy * 0.5;
|
||||
for(; numSamplesY > 0; --numSamplesY)
|
||||
{
|
||||
vec2 pos = origin;
|
||||
int numX = numSamplesX;
|
||||
for(; numX > 0; --numX)
|
||||
{
|
||||
#ifdef OUTLINE
|
||||
color_coeff += colorCoeff(distanceFromEdge(pos), blend_width, blend_half_width);
|
||||
#else
|
||||
color_coeff += colorCoeff(distanceFromEdge(pos), blend_width, blend_half_width);
|
||||
#endif
|
||||
pos += delta_tx;
|
||||
}
|
||||
origin += delta_ty;
|
||||
}
|
||||
|
||||
color_coeff /= numSamples;
|
||||
|
||||
#ifdef OUTLINE
|
||||
float vertex_alpha = vertexColor.a * color_coeff.x;
|
||||
float outline_alpha = BACKDROP_COLOR.a * color_coeff.y;
|
||||
float total_alpha = vertex_alpha + outline_alpha;
|
||||
|
||||
if (total_alpha <= 0.0)
|
||||
return vec4(0.0, 0.0, 0.0, 0.0);
|
||||
|
||||
return vec4(vertexColor.rgb * (vertex_alpha / total_alpha) + BACKDROP_COLOR.rgb * (outline_alpha / total_alpha), total_alpha);
|
||||
#else
|
||||
return vec4(vertexColor.rgb, vertexColor.a * color_coeff);
|
||||
#endif
|
||||
}
|
||||
|
||||
#else // SIGNED_DISTANCE_FIELD
|
||||
|
||||
vec4 textColor(vec2 src_texCoord)
|
||||
{
|
||||
#ifdef OUTLINE
|
||||
float alpha = TEXTURE(glyphTexture, src_texCoord).ALPHA;
|
||||
float delta_tc = 1.6 * OUTLINE * GLYPH_DIMENSION / TEXTURE_DIMENSION;
|
||||
|
||||
float outline_alpha = alpha;
|
||||
vec2 origin = src_texCoord - vec2(delta_tc * 0.5, delta_tc * 0.5);
|
||||
|
||||
float numSamples = 3.0;
|
||||
delta_tc = delta_tc / (numSamples - 1.0);
|
||||
|
||||
float background_alpha = 1.0;
|
||||
|
||||
for(float i = 0.0; i < numSamples; ++i)
|
||||
{
|
||||
for(float j = 0.0; j < numSamples; ++j)
|
||||
{
|
||||
float local_alpha = TEXTURE(glyphTexture, origin + vec2(i * delta_tc, j * delta_tc)).ALPHA;
|
||||
outline_alpha = max(outline_alpha, local_alpha);
|
||||
background_alpha *= (1.0 - local_alpha);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef osg_TextureQueryLOD
|
||||
float mipmapLevel = osg_TextureQueryLOD(glyphTexture, src_texCoord).x;
|
||||
if (mipmapLevel < 1.0)
|
||||
outline_alpha = mix(1.0 - background_alpha, outline_alpha, mipmapLevel / 1.0);
|
||||
#endif
|
||||
|
||||
if (outline_alpha < alpha)
|
||||
outline_alpha = alpha;
|
||||
if (outline_alpha > 1.0)
|
||||
outline_alpha = 1.0;
|
||||
if (outline_alpha == 0.0)
|
||||
return vec4(0.0, 0.0, 0.0, 0.0); // outside glyph and outline
|
||||
|
||||
vec4 color = mix(BACKDROP_COLOR, vertexColor, smoothstep(0.0, 1.0, alpha));
|
||||
color.a = vertexColor.a * smoothstep(0.0, 1.0, outline_alpha);
|
||||
|
||||
return color;
|
||||
|
||||
#else // OUTLINE
|
||||
float alpha = TEXTURE(glyphTexture, src_texCoord).ALPHA;
|
||||
if (alpha == 0.0)
|
||||
return vec4(0.0, 0.0, 0.0, 0.0);
|
||||
|
||||
return vec4(vertexColor.rgb, vertexColor.a * alpha);
|
||||
#endif // OUTLINE
|
||||
}
|
||||
|
||||
#endif // SIGNED_DISTANCE_FIELD
|
||||
|
||||
void main(void)
|
||||
{
|
||||
if (texCoord.x < 0.0 && texCoord.y < 0.0)
|
||||
{
|
||||
osg_FragColor = vertexColor;
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef SHADOW
|
||||
float scale = -1.0 * GLYPH_DIMENSION / TEXTURE_DIMENSION;
|
||||
vec2 delta_tc = SHADOW * scale;
|
||||
vec4 shadow_color = textColor(texCoord + delta_tc);
|
||||
|
||||
shadow_color.rgb = BACKDROP_COLOR.rgb;
|
||||
vec4 glyph_color = textColor(texCoord);
|
||||
|
||||
// lower the alpha_power value the greater the staturation, no need to be so aggressive with SDF than GREYSCALE
|
||||
#if SIGNED_DISTANCE_FIELD
|
||||
float alpha_power = 0.6;
|
||||
#else
|
||||
float alpha_power = 0.5;
|
||||
#endif
|
||||
|
||||
// over saturate the alpha values to make sure the font and it's shadow are clear
|
||||
shadow_color.a = pow(shadow_color.a, alpha_power);
|
||||
glyph_color.a = pow(glyph_color.a, alpha_power);
|
||||
vec4 color = mix(shadow_color, glyph_color, glyph_color.a);
|
||||
|
||||
#else // SHADOW
|
||||
vec4 color = textColor(texCoord);
|
||||
#endif // SHADOW
|
||||
|
||||
if (color.a == 0.0)
|
||||
discard;
|
||||
|
||||
osg_FragColor = color;
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
// -*-C++-*-
|
||||
#version 330
|
||||
#pragma vscode_glsllint_stage : vert
|
||||
|
||||
out vec2 texCoord;
|
||||
out vec4 vertexColor;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||
texCoord = gl_MultiTexCoord0.xy;
|
||||
vertexColor = gl_Color;
|
||||
}
|
Loading…
Reference in a new issue