在片段着色器中更改 OpenGL 中纹理的颜色不太有效
Changing the color of a texture in OpenGL in the fragment shader isn't quite working
我正在尝试让我的 GUI 在游戏中改变颜色成为可能,而无需加载新的纹理。以下是我目前的实施方式。
我在片段着色器中使用 Sampler2D 获取纹理的颜色,然后在一些统一变量的帮助下,
uniform int maxSwapColors;
uniform bool colorSwap;
uniform vec3 textureColors[3];
uniform vec3 toBeColors[3];
我检查是否应更改片段的颜色,即它是否等于 textureColors 中的颜色。其中 textureColor 是从 Sampler2D 收集的实际预加载纹理的颜色。
for(int i = 0; i < maxSwapColors; i++) {
if(textureColor.xyz == textureColors[i]) {
textureColor.xyz = toBeColors[i];
}
}
除一个问题外,此方法有效。
颜色几乎完全转换,除了 4 条颜色由于某种原因混合在一起。实际纹理由全红和全绿两种颜色组成。在这些条带中,您可以看到预加载纹理的颜色。
我假设混合是由于 OpenGL 在某些时候发生的,但我不知道发生在何处或为什么发生。即使我 GL11.glDisable(GL11.GL_BLEND);
也会发生这种情况
我尝试使用 glsl 的 greaterThan() 和 lessThan() 方法为 textureColors 创建一个范围。这会使条带变小,但不会完全去除,所以我正在寻找更全面的解决方案。
谢谢,如有任何帮助,我们将不胜感激!
发生混合是因为您的纹理使用了线性 过滤。请改用 最近 过滤。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
我正在尝试让我的 GUI 在游戏中改变颜色成为可能,而无需加载新的纹理。以下是我目前的实施方式。
我在片段着色器中使用 Sampler2D 获取纹理的颜色,然后在一些统一变量的帮助下,
uniform int maxSwapColors;
uniform bool colorSwap;
uniform vec3 textureColors[3];
uniform vec3 toBeColors[3];
我检查是否应更改片段的颜色,即它是否等于 textureColors 中的颜色。其中 textureColor 是从 Sampler2D 收集的实际预加载纹理的颜色。
for(int i = 0; i < maxSwapColors; i++) {
if(textureColor.xyz == textureColors[i]) {
textureColor.xyz = toBeColors[i];
}
}
除一个问题外,此方法有效。
颜色几乎完全转换,除了 4 条颜色由于某种原因混合在一起。实际纹理由全红和全绿两种颜色组成。在这些条带中,您可以看到预加载纹理的颜色。
我假设混合是由于 OpenGL 在某些时候发生的,但我不知道发生在何处或为什么发生。即使我 GL11.glDisable(GL11.GL_BLEND);
我尝试使用 glsl 的 greaterThan() 和 lessThan() 方法为 textureColors 创建一个范围。这会使条带变小,但不会完全去除,所以我正在寻找更全面的解决方案。
谢谢,如有任何帮助,我们将不胜感激!
发生混合是因为您的纹理使用了线性 过滤。请改用 最近 过滤。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);