0

私はシェーダーと OpenGL 全般に不慣れです。いくつかのチュートリアルを読んだ後、最初のシェーダーを (LibGDX を使用して) 作成することにしました。

問題は、画面が完全に黒いことです...

私のJavaコード:

public class Application extends
                        ApplicationAdapter {

    private ShaderProgram   mShaderProgram;
    private Mesh            mMesh;

    @Override
    public void create() {
        this.createMesh();

        if (Gdx.graphics.isGL20Available()) {
            this.createShaderProgram();
        }

        this.log("" + this.mShaderProgram.isCompiled()); // outputs "true"
    }

    private void createMesh() {
        this.mMesh = new Mesh(true, 3, 4, VertexAttribute.Position());

        this.mMesh.setIndices(new short[] { 0, 1, 2 });
        this.mMesh.setVertices(new float[] {
                -0.5f, -0.5f, 0,
                0f, 0.5f, 0,
                0.5f, -0.5f, 0
        });
    }

    private void createShaderProgram() {
        final FileHandle fragmentShader = Gdx.files.internal("fragment.txt");
        final FileHandle vertexShader = Gdx.files.internal("vertex.txt");

        this.mShaderProgram = new ShaderProgram(vertexShader, fragmentShader);
    }

    @Override
    public void dispose() {
        this.mMesh.dispose();
        if (this.mShaderProgram != null) {
            this.mShaderProgram.dispose();
        }
    }

    private void log(final String message) {
        Gdx.app.log("", message);
    }

    @Override
    public void render() {
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        if (Gdx.graphics.isGL20Available()) {
            this.mShaderProgram.begin();
            this.mMesh.render(this.mShaderProgram, GL10.GL_TRIANGLES);
            this.mShaderProgram.end();
        }
        else {
            this.mMesh.render(GL10.GL_TRIANGLES);
        }
    }
}

私のフラグメントシェーダー:

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

私の頂点シェーダー:

void main() {
    gl_Position = ftransform();
}

gl_Vertex代わりに使用しftransform()ても何も変わりませんでした。

4

2 に答える 2

1

何も表示されないのは、頂点シェーダーが何もしないためです。コードを正しく機能させるには、少なくとも次のことを行う必要があります。

頂点シェーダー:

#ifdef GL_ES
precision mediump float;
#endif

attribute vec4 a_position;

void main()
{
    gl_Position = a_position;
}

OpenGL ES でシェーダーがどのように機能するかをよりよく理解するために、いくつかのシェーダー チュートリアルを参照することをお勧めします。

上記のシェーダー コードを簡単に説明すると、メッシュで "a_position" アトリビュートの頂点アトリビュートを設定しています。頂点シェーダーは、その位置情報をフラグメント シェーダーに渡すだけです。次に、フラグメント シェーダーは、レンダリングされるすべてのフラグメントに白を割り当てます。

于 2013-06-24T21:28:57.013 に答える
0

Web を検索した後、いくつかの GLSL 組み込み属性と関数が GLSL の新しいバージョンで非推奨になっgl_Vertexていることがわかりました。ftransform()

位置と色の属性も自分で登録する必要があるとは知りませんでした。

于 2013-06-25T13:51:40.790 に答える