2016-07-30 8 views
-2

私はシェイダーの経験で今までにない奇妙な問題にぶつかってきました。私はいくつかのテストシェーダコード(下記参照)を作成し、それを単純なテクスチャで実行しました。シェイダーが間違ったフラグメントカラーを与える

基本的には、私のシェイダーがフラグメントの色を確認し、ある範囲内であれば、そのフラグメントを均一な色変数に応じて色付けします。私が持っている問題は、シェーダがフラグメントの色を正しく認識しないことです。私は色の赤い部分が1に等しいかどうかをチェックするまで行ったので、常にはすべてのフラグメントに対して真を返します。しかし、元のテクスチャを描画するために同じシェーダを使用すると、うまく動作します。

どうしてですか?シェイダーは何のエラーもなくコンパイルされます。私は何かが明らかに欠けているように感じます...

コード(LibGDXにアクセスできる場合は、このコードを自分で実行できます)。

// Java code. 
// Creating sprite, shader and sprite batch. 
SpriteBatch batch = new SpriteBatch(); 
Sprite sprite = new Sprite(new Texture("testTexture.png")); 
ShaderProgram shader = new ShaderProgram(Gdx.files.internal("vertex.vert"), 
       Gdx.files.internal("fragment.frag")); 
// Check to see if the shader has logged any errors. Prints nothing. 
System.out.println(shader.getLog()); 
// We start the rendering. 
batch.begin(); 
// We begin the shader so we can load uniforms into it. 
shader.begin(); 
// Set the uniform (works fine). 
shader.setUniformf("color", Color.RED); 
// We end the shader to tell it we've finished loading uniforms. 
shader.end(); 
// We then tell our renderer to use this shader. 
batch.setShader(shader); 
// Then we draw our sprite.  
sprite.draw(batch); 
// And finally we tell our renderer that we're finished drawing. 
batch.end(); 

// Dispose to release resources. 
shader.dispose(); 
batch.dispose(); 
sprite.getTexture().dispose(); 

// Vertex 
#version 330 

in vec4 a_position; 
in vec4 a_color; 
in vec2 a_texCoord0; 

out vec4 v_color; 
out vec2 v_texCoord0; 

uniform mat4 u_projTrans; 

void main() { 
    v_color = a_color; 
    v_texCoord0 = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

// Fragment 
#version 330 

in vec4 v_color; 
in vec2 v_texCoord0; 

out vec4 outColor; 

uniform vec4 color; 
uniform sampler2D u_texture; 

void main() { 
    // This is always true for some reason... 
    if(v_color.r == 1.0) { 
     outColor = color; 
    } else { 
     // But if I run this code it draws the original texture just fine with the correct colors. 
     outColor = v_color * texture2D(u_texture, v_texCoord0); 
    } 
} 
テクスチャ: simple texture

+1

そして、あなたの頂点はどのような色を持っているのですか?上記のコードを使用することができれば、明らかにそれらは白です。したがって、条件が真であることは驚くことではありません。 –

+0

これはもちろん論理的な理由ですが、私がレンダリングしている唯一のものがこの32x32テクスチャであるときに私の頂点がどのように白くなるかわかりません。 – Charanor

+0

頂点属性 'a_color'を渡しています。頂点バッファでこの属性にどのようなデータを指定しますか?テクスチャの色を比較したい場合は、最初にテクスチャをサンプリングする必要があります。 –

答えて

2

あなたは2つの入力あなたのフラグメントシェーダのための色を持っている:テクスチャとして頂点属性として送信され1つずつを。テクスチャの色をチェックするつもりですが、代わりに頂点属性として送信されたカラー値をチェックします。

// Vertex 
#version 330 

in vec4 a_position; 
in vec4 a_color; // <--- A color value is passed as a vertex attribute 
in vec2 a_texCoord0; 

out vec4 v_color; 
out vec2 v_texCoord0; 

uniform mat4 u_projTrans; 

void main() { 
    v_color = a_color; // <--- you are sending it to fragment shader 
    v_texCoord0 = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

// Fragment 
#version 330 

in vec4 v_color; // <--- coming from vertex buffer 
in vec2 v_texCoord0; 

out vec4 outColor; 

uniform vec4 color; 
uniform sampler2D u_texture; 

void main() { 
    // This is always true for some reason... 
    if(v_color.r == 1.0) { // <--- and then checking this vertex attribute color 
     outColor = color; //  instead of what you send from texture 
    } else { 
     ... 
    } 
} 
関連する問題