基于特定颜色的Libgdx混合纹理?

基于特定颜色的Libgdx混合纹理?,libgdx,sprite,tile,alphablending,Libgdx,Sprite,Tile,Alphablending,为了用一种简单的方式解释这个问题,想象三个16x16地形图块:一个全沙,一个全草,以及一个沙和草的过渡 创建地图后,我想在这些瓷砖上覆盖一个更大的图案,这样它们看起来就不会那么重复了。例如,我当前的解决方案是使用一个大的64x64重复沙模式,每次我看到一个沙瓦片时,我都会查看它所在的行和列,并使用64x64瓦片中相应的16x16块。这样,整体使用较大的图案,沙子看起来很漂亮(草也是如此) 问题来自过渡瓷砖,它可能是半沙半草。我希望能够用沙子图案覆盖过渡瓷砖的一半,用草图案覆盖另一半。有没有办法声

为了用一种简单的方式解释这个问题,想象三个16x16地形图块:一个全沙,一个全草,以及一个沙和草的过渡

创建地图后,我想在这些瓷砖上覆盖一个更大的图案,这样它们看起来就不会那么重复了。例如,我当前的解决方案是使用一个大的64x64重复沙模式,每次我看到一个沙瓦片时,我都会查看它所在的行和列,并使用64x64瓦片中相应的16x16块。这样,整体使用较大的图案,沙子看起来很漂亮(草也是如此)

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


我不知道如何在LIGBDX中做到这一点,如果它是可能的,那么任何代码帮助都会被理解。

你应该在LIGBDX中使用着色器。

如果使用着色器,可以同时将多个纹理传递到fragmentshader:例如,为正确混合而制作/计算的草、沙和b/w混合纹理。碎片着色器可以决定将哪个纹理(草或沙)用于碎片颜色计算(或两者兼而有之)。 您的fragmentshader代码可能如下所示:

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);
}
它不是很优化,特别是当你同时绑定多个纹理时,它可能会减慢你的程序/应用程序