我有一个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);
}
随着你定义你的字体图像的方式,红的量的多少决定了轮廓颜色的使用,和绿色的量决定了内部的颜色的多少来使用。 等你以后采样纹理,可以简单地计算出轮廓颜色的和内部颜色的加权平均,与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;
}
如果这将工作r
和g
纹理的成分是对于那些字母以外的部分为零。 如果外界不是黑色,但是a
纹理的部件被用来掩盖出来,表述变得稍微复杂一些:
void main()
{
vec4 texVal = texture2D(u_texture, v_texCoords);
gl_FragColor = vec4(texVal.g * v_color.rgb + texVal.r, texVal.a);
}
红色:#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的混合物,你应该只使用颜色( 或颜色 )。