2016-05-14 21 views
0

我试图让我的GUI可以在游戏中更改颜色,而无需加载新纹理。这是我现在如何实施的。在片段着色器中更改OpenGL中纹理的颜色并不起作用

我得到的片段着色器使用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技术存在的,但我不知道在哪里,或者为什么。即使我发生这种情况,我也尝试使用glsl的greaterThan()和lessThan()方法为textureColors创建一个范围。这使得乐队更小,但不会完全删除它们,所以我正在寻找更全面的解决方案。

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

回答

1

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
+0

谢谢!我应该在渲染之前放置这个吗? –

+0

在生成并绑定纹理后,您可以在开始时只放置一次。 – MarGenDo

相关问题