9

XNA/HLSL バックグラウンドから来て、libgdx を使用してシェーダーを理解しようとしています。シェーダーなしで取得した出力を再現するために vert/frag シェーダーのペアを取得しようとしていますが、何も表示されません。

シェーダーの作成:

void SetupShader()
{
    ShaderProgram.pedantic = false;
    shader = new ShaderProgram(
            Gdx.files.internal("assets/default.vert").readString(),
            Gdx.files.internal("assets/default.frag").readString());
    if(!shader.isCompiled()) {
        Gdx.app.log("Problem loading shader:", shader.getLog());
    }
    batch.setShader(shader);
}

default.vert:

attribute vec4 a_Position;
attribute vec4 a_Normal;
attribute vec2 a_TexCoord;
attribute vec4 a_Color;

uniform mat4 u_projTrans;

varying vec2 v_texCoords;
varying vec4 v_color;

void main() {
    v_color = a_Color;
    v_texCoords = a_TexCoord;
    gl_Position = u_projTrans * a_Position;
}

default.frag:

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoords;
varying vec4 v_color;

void main() {
    gl_FragColor = v_color;
}

レンダリング:

batch.begin();
for (GameObject gObj : gameObjects)
    gObj.Draw(batch);
batch.end();

ここに何か提案はありますか?私も OpenGL-ES を初めて使用するので、明らかな何かが欠けている可能性があります。投稿する前に少し見回しましたが、ドキュメントSpriteBatch.setShader(ShaderProgram)は次のとおりです。

GLES 2.0 環境で使用するシェーダーを設定します。頂点位置属性を「a_position」、テクスチャ座標属性を「a_texCoords0」、色属性を「a_color」と呼びます。ShaderProgram.POSITION_ATTRIBUTE、ShaderProgram.COLOR_ATTRIBUTE、および ShaderProgram.TEXCOORD_ATTRIBUTE を参照してください。これには、最初のテクスチャ ユニットの使用を示すために「0」が追加されます。射影行列は「u_proj」と呼ばれる mat4 ユニフォームを介してアップロードされ、変換行列は「u_trans」と呼ばれるユニフォームを介してアップロードされ、結合された変換と射影行列は「u_projTrans」と呼ばれる mat4 ユニフォームを介してアップロードされます。テクスチャ サンプラーは、「u_texture」と呼ばれるユニフォームを介して渡されます。デフォルトのシェーダーを使用するには、null 引数を指定してこのメ​​ソッドを呼び出します。

4

1 に答える 1

14

のコードを見ると、コードにSpriteBatchいくつかの間違いがあったようです。以下は正しいシェーダーです。

default.vert:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;

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

default.frag:

#ifdef GL_ES
    precision mediump float;
#endif

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;

void main() {
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}
于 2012-04-15T03:41:29.917 に答える