白色轮廓的OpenGL着色位图字体(OpenGL coloured bitmap font with

2019-10-20 13:17发布

我有一个libgdx游戏,我想使用位图字体与轮廓。 我希望能够设置使用的setColor()的字体颜色,不过,我总是希望轮廓保持白色。 什么是对我来说,实现这一目标的最佳方式是什么? 我假设我应该做使用片段着色器所需的色彩处理。

我创建了一个位图字体如下,其中红色表示行程和绿色代表该组色彩。

我有点坚持了什么,我需要然而,在片段着色器做的。 我的着色器的经验和理解是有限的。 我现在的着色器看起来是这样的,提请正确基于R行程。 我不知道我应该如何设置的颜色来增加(v_color)正确颜色的字体的中间。

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;

void main()
{
  vec4 textureColour = texture2D(u_texture, v_texCoords);
  vec4 colour = vec4(textureColour.r,
                textureColour.r,
                textureColour.r,
                textureColour.a);
  gl_FragColor = vec4(colour.r, colour.g, colour.b, colour.a);
}

Answer 1:

随着你定义你的字体图像的方式,红的量的多少决定了轮廓颜色的使用,和绿色的量决定了内部的颜色的多少来使用。 等你以后采样纹理,可以简单地计算出轮廓颜色的和内部颜色的加权平均,与r采样纹理是所述轮廓颜色的重量,和g作为内部颜色的重量。

着色器中的计算还可以,因为你的外框颜色是固定的白色被简化。 所以, r乘以轮廓颜色仅仅是一个载体r为所有它的组件:

r * vec4(1.0, 1.0, 1.0, 1.0) = vec4(r, r, r, r) = vec4(r)

使用v_color对于内线的颜色变化,片段着色器然后将这个样子:

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;

void main()
{
    vec4 texVal = texture2D(u_texture, v_texCoords);
    gl_FragColor = texVal.g * v_color + texVal.r;
}

如果这将工作rg纹理的成分是对于那些字母以外的部分为零。 如果外界不是黑色,但是a纹理的部件被用来掩盖出来,表述变得稍微复杂一些:

void main()
{
    vec4 texVal = texture2D(u_texture, v_texCoords);
    gl_FragColor = vec4(texVal.g * v_color.rgb + texVal.r, texVal.a);
}


Answer 2:

红色:#FF0000和绿色:Aslong您的纹理颜色由这两个RGB-颜色由#00FF00像他们在你的形象,你可以使用下面的着色器

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;

void main()
{
  vec4 textureColour = texture2D(u_texture, v_texCoords);
  // normalizing the values
  float rgsum = textureColour.r + textureColour.g;
  float pr = textureColour.r / rgsum;
  float pg = textureColour.g / rgsum;
  // setting the color of the fragment
  gl_FragColor = vec4(vec3(1.0) * pr + v_color.rgb * pg, textureColour.a * v_color.a);
}

哦,顺便说一句:非常混乱的BE和AE的混合物,你应该只使用颜色( 或颜色 )。



文章来源: OpenGL coloured bitmap font with white outline