为了简单地解释这个问题,想象一下三个 16x16 的地形图 block :一个全是沙子,一个全是草地,一个是沙子和草地的过渡。
创建 map 后,我想在这些图 block 上覆盖一个更大的图案,这样它们看起来就不会那么重复。例如,我当前的解决方案是使用一个 64x64 的大型重复沙子图案,每次我看到一个沙子瓷砖时,我都会查看它所在的行和列,然后使用 64x64 瓷砖的相应 16x16 block 。这样,整体使用较大的图案,沙子看起来也不错(草也一样)。
问题来自过渡砖,它可能一半是沙子,一半是草地。我希望能够用沙子图案覆盖过渡瓷砖的一半,用草图案覆盖另一半。有什么方法可以声明一半透明并在其上覆盖一些东西,然后声明另一半透明并在其上覆盖其他东西?显然需要两个单独的 alpha channel ——它可以在特定像素颜色的基础上混合吗?意思是我声明一些绿色像素对草地部分透明,一些黄色像素对沙地部分透明?
我不知道如何在 libgdx 中执行此操作,如果可能的话,所以任何代码帮助将不胜感激。
最佳答案
您绝对应该考虑在 libgdx 中使用着色器。
如果您使用着色器,您可以同时将多个纹理传递给片段着色器:例如草地、沙子和为正确混合而制作/计算的黑白混合纹理。您的片段着色器可以决定将哪种纹理(草或沙子)用于片段颜色计算(或两者)。 您的片段着色器代码可能如下所示:
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);
}
它不是很优化,尤其是当您同时绑定(bind)多个纹理时,它可能会降低您的程序/应用程序的速度。
关于Libgdx 基于特定颜色混合纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18852966/