私はシェイダーの経験で今までにない奇妙な問題にぶつかってきました。私はいくつかのテストシェーダコード(下記参照)を作成し、それを単純なテクスチャで実行しました。シェイダーが間違ったフラグメントカラーを与える
基本的には、私のシェイダーがフラグメントの色を確認し、ある範囲内であれば、そのフラグメントを均一な色変数に応じて色付けします。私が持っている問題は、シェーダがフラグメントの色を正しく認識しないことです。私は色の赤い部分が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);
}
}
テクスチャ:
そして、あなたの頂点はどのような色を持っているのですか?上記のコードを使用することができれば、明らかにそれらは白です。したがって、条件が真であることは驚くことではありません。 –
これはもちろん論理的な理由ですが、私がレンダリングしている唯一のものがこの32x32テクスチャであるときに私の頂点がどのように白くなるかわかりません。 – Charanor
頂点属性 'a_color'を渡しています。頂点バッファでこの属性にどのようなデータを指定しますか?テクスチャの色を比較したい場合は、最初にテクスチャをサンプリングする必要があります。 –