Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LibGDX着色器不适用于FBO纹理_Java_Opengl_Opengl Es_Libgdx - Fatal编程技术网

Java LibGDX着色器不适用于FBO纹理

Java LibGDX着色器不适用于FBO纹理,java,opengl,opengl-es,libgdx,Java,Opengl,Opengl Es,Libgdx,我有一个着色器,我想在最后对整个渲染图像运行着色器,而不是在屏幕上渲染的每个单独的精灵。为此,我创建了一个FBO,将所有图像渲染到FBO,然后渲染到FBO生成的colorBufferTexture。只有一个问题,渲染FBO纹理时着色器不工作。WithOutbo()方法在着色器正常工作的情况下渲染图像,但withFbo()方法仅在没有着色器的情况下渲染图像。我还知道withFbo()中的着色器正在工作,因为如果我尝试渲染其他对象,那么FBO中的colorBufferTexture着色器将工作。那么

我有一个着色器,我想在最后对整个渲染图像运行着色器,而不是在屏幕上渲染的每个单独的精灵。为此,我创建了一个FBO,将所有图像渲染到FBO,然后渲染到FBO生成的colorBufferTexture。只有一个问题,渲染FBO纹理时着色器不工作。WithOutbo()方法在着色器正常工作的情况下渲染图像,但withFbo()方法仅在没有着色器的情况下渲染图像。我还知道withFbo()中的着色器正在工作,因为如果我尝试渲染其他对象,那么FBO中的colorBufferTexture着色器将工作。那么为什么着色器不能处理FBO生成的纹理呢

注意:着色器正在使用此代码,问题是当我使用fboTexture时它不工作。如果我调用batch.draw(sprite,…),则着色器将在withFbo()和WithOutbo()方法中工作,但我调用batch.draw(fboTexture,…),则它将只渲染FBO纹理而不应用着色器

public class Application3 extends ApplicationAdapter
{
    float time;
    Sprite sprite;
    FrameBuffer fbo;
    SpriteBatch batch;
    Texture noiseTexture;
    TextureRegion fboTexture;
    ShaderProgram shaderProgram;

    @Override public void create()
    {
        ShaderProgram.pedantic = false;
        batch = new SpriteBatch();

        sprite = new Sprite(new Texture("game.png"));
        sprite.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        shaderProgram = new ShaderProgram(Gdx.files.internal(Shader.GLITCH2.getVertex()), Gdx.files.internal(Shader.GLITCH2.getFragment()));

        noiseTexture = new Texture(Gdx.files.internal(Shader.GLITCH2.getPath() + "noise.png"));
        noiseTexture.bind(0);

        fbo = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
        fboTexture = new TextureRegion(fbo.getColorBufferTexture());
        fboTexture.flip(false, true);
    }

    @Override public void render()
    {
        //withFbo();
        withoutFbo();
    }

    void withoutFbo()
    {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        time += Gdx.graphics.getDeltaTime();

        shaderProgram.setUniformi("u_noise", 0);
        shaderProgram.setUniformf("u_time", time);
        batch.setShader(shaderProgram);
        batch.begin();

        batch.draw(sprite, sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());

        batch.setShader(null);
        batch.end();
    }

    void withFbo()
    {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        time += Gdx.graphics.getDeltaTime();

        fbo.begin();
        batch.begin();

        batch.draw(sprite, sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());

        batch.end();
        fbo.end();

        shaderProgram.setUniformi("u_noise", 0);
        shaderProgram.setUniformf("u_time", time);
        batch.setShader(shaderProgram);
        batch.begin();

        batch.draw(fboTexture, sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());

        batch.setShader(null);
        batch.end();
    }
}

不使用着色器程序进行渲染是什么意思?那是不可能的。顺便说一下,您应该在调用
begin()
end()
之间设置对
setUniform*
的调用。不使用着色器程序进行渲染是什么意思?那是不可能的。顺便说一下,您应该在调用
begin()
end()
之间设置对
setUniform*
的调用。