Libgdx - 基本着色器无法正常工作

时间:2013-06-24 21:09:54

标签: java opengl 2d shader libgdx

我是Shaders的新手,也是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()并没有改变任何内容。

2 个答案:

答案 0 :(得分:1)

您没有看到任何内容的原因是因为您的顶点着色器不执行任何操作。为了使代码正常工作,您需要至少执行以下操作:

顶点着色器:

#ifdef GL_ES
precision mediump float;
#endif

attribute vec4 a_position;

void main()
{
    gl_Position = a_position;
}

我建议您查看一些着色器教程,以便更好地了解着色器在OpenGL ES中的工作原理。

要快速解释上述着色器代码,请在网格中设置“a_position”属性的顶点属性。顶点着色器只是将该位置信息传递给片段着色器。然后片段着色器将白色分配给要渲染的所有片段。

答案 1 :(得分:0)

搜索网页后,我发现了一些GLSL内置属性&新版本的GLSL中不推荐使用gl_Vertexftransform()等函数。

我不知道现在你必须注册位置&你自己的颜色属性。