【问题标题】:Libgdx - Basic shader not workingLibgdx - 基本着色器不起作用
【发布时间】:2013-06-25 21:51:40
【问题描述】:

我是着色器的新手,一般来说也是 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() 并没有改变任何东西。

【问题讨论】:

    标签: java opengl 2d shader libgdx


    【解决方案1】:

    您看不到任何东西的原因是您的顶点着色器没有做任何事情。要使代码正常工作,您至少需要让它执行以下操作:

    顶点着色器:

    #ifdef GL_ES
    precision mediump float;
    #endif
    
    attribute vec4 a_position;
    
    void main()
    {
        gl_Position = a_position;
    }
    

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

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

    【讨论】:

    • 是的,我在 5 分钟前的教程中找到了这个基本代码,它可以工作。但是我在一些教程中读到 GLSL 有内置变量,包括 gl_Vertex ,它在顶点着色器中保存像 a_position 这样的位置数据,以及模拟固定 之前 OpenGL 版本的管道 (modelViewMatrix * position)。是否可以使用这些变量而不是创建新变量?这将简化着色器的代码。片段着色器中输入 gl_Color 的相同问题。
    • 您必须记住,OpenGL ES 和 OpenGL 是不同的,并且每个版本都有不同的语言部分。我认为固定的管道函数仅对 OpenGL ES 1.x 有效,对 OpenGL ES 2.0/3.0 无效。在 2.0 中,您必须将值作为属性或统一变量传递。如果您想在 libGDX 中使用更复杂的示例,可以参考这个答案:stackoverflow.com/questions/15398184/…
    • 在网上搜索后,我发现一些 GLSL 内置属性和函数,如 gl_Vertexftransform() 在新版本的 GLSL 中已被弃用。我不知道现在你必须自己注册位置和颜色属性。
    • 如果您真的想深入了解 OpenGL ES 着色器的详细信息,最宝贵的参考资料是此处的快速参考指南:khronos.org/opengles/sdk/docs/reference_cards/…
    【解决方案2】:

    在网上搜索后,我发现一些 GLSL 内置属性和函数,如 gl_Vertexftransform() 在新版本的 GLSL 中已被弃用。

    不知道现在连位置和颜色属性都得自己注册。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多