Libgdx - 在纹理的透明颜色

时间:2015-09-23 21:14:47

标签: libgdx drawing

我试图为纹理着色一种颜色,但我希望纹理在色调下显示。例如,我有一个人的照片,但我想将它们涂成淡绿色,而不是改变实际人物本身的透明度。

到目前为止,我尝试使用带有rgba值的SpriteBatch方法 setColor 。当我将alpha值设置为.5时,它将使用该alpha值呈现着色和纹理。有没有办法分离色调和纹理的alpha值?

我知道我可以在它上面绘制另一个纹理,但我不想为这个纹理设置两个绘制通道,因为它效率低下。无论如何,无论如何都要在原始的OpenGL中做到这一点也很棒。

3 个答案:

答案 0 :(得分:0)

你可以在没有alpha权限的情况下绘制它吗?颜色叠加越浅,显示的越少(默认情况下为Color.White)。因此,如果您想将其略微调整为绿色,则可以使用new Color(.9f, 1f, .9f, 1f)中途new Color(.5f, 1f, .5f, 1f)和全绿new Color(.0f, 1f, .0f, 1f)

答案 1 :(得分:0)

您描述的行为(alpha影响整个精灵的透明度)由着色器定义。

解决这个问题的简单方法是@ MennoGouw的答案,但这会使图像变暗。如果要避免变暗,则必须使用自定义着色器。您可以使用与Photoshop中的叠加混合模式有点相似的着色器。

这是一个叠加片段着色器,可以与SpriteBatch默认着色器中的顶点着色器结合使用(查看其源代码)。您可以在此处使用setColor方法设置色调。要控制色调,您需要混合白色。如果需要,此方法允许保留alpha以用于淡入和淡出精灵。

tmpColor.set(tintColor).lerp(Color.WHITE, 1f - tintAmount);
tmpColor.a = transparencyAmount;
batch.setColor(tmpColor);

-

#ifdef GL_ES
    #define LOWP lowp
    precision mediump float;
#else
    #define LOWP
#endif

varying vec2 v_texCoords;
varying LOWP vec4 v_color;

uniform sampler2D u_texture;

const vec3 one = vec3(1.0);

void main()
{
    vec4 baseColor = texture2D(u_texture, v_texCoords);
    vec3 multiplyColor = 2.0 * baseColor.rgb * v_color.rgb;
    vec3 screenColor = one - 2.0 * (one - baseColor.rgb)*(one - v_color.rgb);
    gl_FragColor = vec4(mix(multiplyColor, screenColor, step(0.5, baseColor.rgb)), v_color.a * baseColor.a);
}

答案 2 :(得分:0)

我找到了简单的解决方案

float light = .5f; //between 0 and 1
batch.setColor(light, light, light, 1);
batch.draw(...);
batch.setColor(Color.White);