【问题标题】:How can I render the same texture with different colors?如何用不同的颜色渲染相同的纹理?
【发布时间】:2024-01-14 10:25:01
【问题描述】:

我在黑色背景上有一个非常简单的白色形状纹理,我希望能够在不更改源纹理的情况下为白色部分指定不同的颜色:

在 libgdx 中是否有内置方法可以做到这一点,或者我是否必须编写自定义着色器(如果有,最好的方法是什么)?

注意:我使用的是 3D api,所以我的问题是关于 ModelBatch、材料以及如何使用它们来渲染 3D 几何体。

【问题讨论】:

  • 您可以使用SpriteBatch#setColor,它将为所有使用此SpriteBatch 渲染的Textures 着色。这意味着,白色成为浅色,黑色保持黑色,所有其他颜色成为两者的混合。也可以使用PixMap 来做到这一点,它允许您操纵每个像素并从中创建一个Texture。请注意,如果您使用的是 TextureAtlas,如果您使用的是从 PixMap 创建的 Texture,您将失去它的优势。
  • @Springrbua 正如标签所暗示的那样,我使用的是 3d api,所以没有“SpriteBatch”——我使用 ModelBatch 来绘制带有随附材料的模型实例。
  • 哦,对不起,我没看到。您可以更改每个ModelInstanceMaterial,而不影响原来的Model 和其他ModelInstances。所以你可以用绿色或蓝色切换白色Material。也许也可以在ModelInstance 上添加一个半透明的Material 并启用混合,它应该为白色部分着色。 PixMap 的方式也应该是可能的,因为您可以从中创建一个Texture,然后可以将其用作Material
  • @Springrbua 所有这些方法似乎都需要多种颜色的多种纹理。我想要一个可以用不同方式渲染的单一纹理。
  • 如果使用颜色而不是Texture,则不需要任何Texture,但这取决于最终ModelInstance 的外观。如果您使用 PixMap 执行此操作,则只需存储 1 个 Texture 并在运行时对其进行操作。然后,您将拥有多个 Texture arround(每种颜色 1 个),但它们不会存储在资产中。

标签: colors 3d libgdx textures


【解决方案1】:

事实证明,如果材质具有 TextureAttribute.Diffuse 和 ColorAttribute.Diffuse,则从纹理中导出的颜色值将与颜色属性定义的值相乘,如 @987654321 所示@:

#elif defined(diffuseTextureFlag) && defined(diffuseColorFlag)
    vec4 diffuse = texture2D(u_diffuseTexture, v_diffuseUV) * u_diffuseColor;

因此,就我而言,我可以简单地设置颜色属性的值,这将产生所需的结果 -> 纹理的黑色部分将保持不变,因为零(黑色)乘以 X 将导致零;纹理的白色部分将更改为通过颜色属性设置的任何颜色,因为 1(白色)乘以 X 将得到 X。

【讨论】: