3

为了简单地解释这个问题,想象三个 16x16 的地形图块:一个满沙,一个满草,一个沙草过渡。

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

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

如果可能的话,我不知道如何在 libgdx 中执行此操作,因此将不胜感激任何代码帮助。

4

1 回答 1

2

您绝对应该考虑在 libgdx 中使用着色器。

如果您使用着色器,您可以同时将多个纹理传递给片段着色器:例如,为正确混合而制作/计算的草、沙和 ab/w 混合纹理。您的片段着色器可以决定使用哪种纹理(草或沙)进行片段颜色计算(或两者都使用)。您的片段着色器代码可能如下所示:

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);
}

它不是很优化,特别是当您同时绑定多个纹理时,它可能会减慢您的程序/应用程序。

于 2013-09-17T18:20:27.110 回答