2016-05-14 4 views
0

新しいテクスチャで読み込むことなく、GUIの色をゲーム内で変更できるようにしようとしています。ここで私はそれが今のところ実装されている方法です。フラグメントシェーダのOpenGLでテクスチャの色を変更することはあまり効果がありません

私は、私はフラグメントの色を変更する必要があるかどうかをチェックし

uniform int maxSwapColors; 
uniform bool colorSwap; 
uniform vec3 textureColors[3]; 
uniform vec3 toBeColors[3]; 

、その後、いくつかの均一な変数の助けを借りて、フラグメントシェーダでSampler2Dを使用して、テクスチャの色を取得することがあること、すなわち、 textureColors内の色に等しい。 textureColorは、Sampler2Dから集められた実際にプリロードされたテクスチャの色です。

for(int i = 0; i < maxSwapColors; i++) { 
     if(textureColor.xyz == textureColors[i]) { 
      textureColor.xyz = toBeColors[i]; 
     } 
    } 

これは1つの問題を除いて動作します。

enter image description here

色は、それが何らかの理由でブレンド色の4つのバンドを除いて、ほぼ完全に切り替えます。実際のテクスチャは、フルレッドとフルグリーンの2色で構成されています。これらのバンドでは、プリロードされたテクスチャの色を見ることができます。

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

テクスチャを生成してバインドした直後に、これを最初に1回だけ配置することができます。 – MarGenDo

関連する問題