Libgdx-纹理上的透明颜色

Libgdx-纹理上的透明颜色,libgdx,drawing,Libgdx,Drawing,我试图将纹理着色为颜色,但我希望纹理在着色下显示。例如,我有一个人的照片,但我想把它们染成浅绿色,而不改变真实人物本身的透明度 到目前为止,我尝试使用SpriteBatch方法setColor,它接受rgba值。当我将alpha值设置为.5时,它将使用该alpha值渲染着色和纹理。有没有办法将色调和纹理的alpha值分开 我知道我可以在它上面画另一个纹理,但我不想为一个纹理画两个绘制过程,因为这样效率会很低。如果有任何方法可以在原始OpenGL中实现,那也太好了。您可以在没有alpha的情况下绘

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

到目前为止,我尝试使用SpriteBatch方法setColor,它接受rgba值。当我将alpha值设置为.5时,它将使用该alpha值渲染着色和纹理。有没有办法将色调和纹理的alpha值分开


我知道我可以在它上面画另一个纹理,但我不想为一个纹理画两个绘制过程,因为这样效率会很低。如果有任何方法可以在原始OpenGL中实现,那也太好了。

您可以在没有alpha的情况下绘制它,对吗?颜色覆盖越浅,默认情况下显示的颜色就越少。白色。因此,如果要将其着色为微绿色,可以使用新颜色。9f、1f、.9f、1f中间将是新颜色。5f、1f、.5f、1f和全绿色新颜色。0f、1f、.0f、1f。

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

处理这个问题的简单方法是@MennoGouw的答案,但这总是会使图像变暗。如果要避免变暗,必须使用自定义着色器。您可以使用一个着色器,其行为有点像photoshop中的叠加混合模式

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

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


我发现简单的解决办法是

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

这与我提出的解决方案类似。这实际上是一个双重职位,但我忘了删除这一个和关闭它。我把它发布在游戏开发部分,得到了一个答案,我将在下面发布
float light = .5f; //between 0 and 1
batch.setColor(light, light, light, 1);
batch.draw(...);
batch.setColor(Color.White);