Libgdx根据特定颜色混合纹理?

时间:2013-09-17 14:44:24

标签: libgdx sprite tile alphablending

要以简单的方式解释这个问题,想象一下三个16x16地形砖:一个完整​​的沙子,一个完整的草地,以及一个沙子和草的过渡。

创建地图后,我想将更大的图案叠加到这些图块上,这样它们看起来就不那么重复了。例如,我当前的解决方案是使用大的64x64重复砂模式,每次看到砂砖时,我会查看其中的行和列,而是使用相应的64x64块的16x16块。这样,整体使用较大的图案,沙子看起来很好(草地也一样)。

问题在于过渡砖,可能是半沙,半草。我希望能够用沙子图案覆盖一半过渡砖,另一半用草图案覆盖。有没有办法声明一半的瓷砖透明并在其上覆盖一些东西,然后声明另一半透明并覆盖其他东西?显然需要有两个独立的alpha通道 - 它可以在特定的像素颜色基础上混合吗?意思是我声明一些绿色像素对于草部分是透明的而一些黄色像素对于沙子部分是透明的吗?

我不知道如何在libgdx中执行此操作,如果可能的话,那么任何代码帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

您应该明确考虑在libgdx中使用着色器。

如果使用着色器,则可以同时将多个纹理传递给碎片整理器:例如,为正确的混合制作/计算草,沙子和黑白混合纹理。碎片整理器可以决定使用哪种纹理(草或沙子)进行碎片颜色计算(或两者)。 你的fragmenthader代码可能如下所示:

void main() {
    float alpha = texture2D(u_yourBlendingTexture, v_yourTerrainTexCoords);
    gl_FragColor = texture2D(u_yourGrassTexture, v_yourTerrainTexCoords) * alpha + texture2D(u_yourSandTexture, v_yourTerrainTexCoords) * (1.0 - alpha);
}

替代:

void main() {
    float alpha = texture2D(u_yourBlendingTexture, v_yourTerrainTexCoords);
    gl_FragColor = mix(texture2D(u_yourGrassTexture, v_yourTerrainTexCoords), texture2D(u_yourSandTexture, v_yourTerrainTexCoords), alpha);
}

它没有得到很好的优化,特别是当你绑定多个纹理的同时它可能会减慢你的程序/应用程序。