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

标签 libgdx sprite tile alphablending

为了简单地解释这个问题,想象一下三个 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/

相关文章:

Javascript - 在 Canvas 上平铺多个图像

java - Box2D 灯光在 scene2d Actor 绘制之间渲染

c# - 高效地绘制 2D Sprite (位图)图 block

mobile - 如何在 WP7 上创建动画磁贴?

opengl - 使用 OpenGL 绘制图 block 的技术

css - 图像 Sprite 悬停

android - 将 Android 位图转换为 LibGdx 的纹理

java - Shaperenderer 崩溃 libgdx

java - 自新更新以来从 libgdx 加载场景重叠 2d

xcode - 替换 Sprite 中的图像-iPhone的Cocos2d游戏开发