在片段着色器中更改OpenGL中纹理的颜色并不是很有效

时间:2016-05-14 16:27:59

标签: java opengl glsl fragment-shader

我试图让我的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];
        }
    }

除了一个问题外,这是有效的。

enter image description here

颜色几乎完全切换,除了由于某种原因混合的4个色带。实际纹理由两种颜色组成,全红色和全绿色。在这些波段中,您可以看到预加载纹理的颜色。

enter image description here

我认为混合是因为OpenGL在某些时候发生的,但我不知道在哪里或为什么。即使我GL11.glDisable(GL11.GL_BLEND);

,也会发生这种情况

我尝试使用glsl的greaterThan()和lessThan()方法为textureColors创建一个范围。这使得乐队变小但不完全删除它们,所以我正在寻找更全面的解决方案。

谢谢,任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

发生混合是因为纹理使用线性过滤。请改用最近的过滤。

... join
Paziente paziente3_ force index (idx_nome) ...