Opengl 在LibGDX中检索帧缓冲区时出现黑色纹理

Opengl 在LibGDX中检索帧缓冲区时出现黑色纹理,opengl,libgdx,framebuffer,fbo,Opengl,Libgdx,Framebuffer,Fbo,在我的程序中,我首先渲染某个摄影机看到的场景,然后我想将该场景(Colorbuffer)检索到纹理对象,这样我就可以将其绘制到占据整个屏幕的四边形。虽然它看起来很愚蠢,但想法只是看看纹理是否工作正常,这样我就可以在另一个不那么愚蠢的渲染中使用它(我正在尝试应用阴影贴图);可悲的是,它没有像我希望的那样工作。getColorBufferTexture()调用看起来像是在返回黑色纹理,不管我在第一个渲染片段着色器中为FragColor提供的最终颜色是什么。使用默认的ColorBuffer只测试第一个

在我的程序中,我首先渲染某个摄影机看到的场景,然后我想将该场景(Colorbuffer)检索到纹理对象,这样我就可以将其绘制到占据整个屏幕的四边形。虽然它看起来很愚蠢,但想法只是看看纹理是否工作正常,这样我就可以在另一个不那么愚蠢的渲染中使用它(我正在尝试应用阴影贴图);可悲的是,它没有像我希望的那样工作。getColorBufferTexture()调用看起来像是在返回黑色纹理,不管我在第一个渲染片段着色器中为FragColor提供的最终颜色是什么。使用默认的ColorBuffer只测试第一个渲染,在屏幕上显示它必须显示的内容,因此第一个渲染没有问题。 代码如下:

第一次渲染

FrameBuffer shadowBuffer = new FrameBuffer(Pixmap.Format.RGBA8888,20, 20, true);
        shadowBuffer.begin();
        shadowShaderProgram.begin();
        for(DisplayableObject obj : objects) {
            shadowShaderProgram.setUniformMatrix("u_modelViewProjectionMatrix", shadowCamera.getPVMatrix().mul(obj.getTMatrix()));
            shadowShaderProgram.setUniformMatrix("u_modelViewMatrix", shadowCamera.getVMatrix().mul(obj.getTMatrix()));
            obj.getTexture().bind();
            obj.getMesh().render(shadowShaderProgram, GL20.GL_TRIANGLES);
        }
        shadowShaderProgram.end();
        shadowBuffer.end();           
        Texture shadowMap = shadowBuffer.getColorBufferTexture();
然后第二个,尝试绘制纹理

Mesh mesh = new Mesh(true, 4, 6, new VertexAttribute(VertexAttributes.Usage.Position, 4, "a_position"), new VertexAttribute(VertexAttributes.Usage.TextureCoordinates, 2, "a_texCoord0"));
        mesh.setVertices(new float[] { //position, texCoord
            -1f, -1f, 0f, 1f, 0f, 0f,
            1f, -1f, 0f, 1f, 1f, 0f,
            1f, 1f, 0f, 1f, 1f, 1f,
            -1f, 1f, 0f, 1f, 0f, 1f
   });
        mesh.setIndices(new short[]{0,1,2,2,3,0});
        String vs = Gdx.files.internal("auxShaderVert.glsl").readString();
        String fs = Gdx.files.internal("auxShaderFrag.glsl").readString();
        ShaderProgram auxShader = new ShaderProgram(vs,fs);
        auxShader.begin();
        shadowMap.bind();
        auxShader.setUniformi("shadowMap", 0);
        mesh.render(auxShader,GL20.GL_TRIANGLES);
        auxShader.end();
第二次渲染的着色器分别为:

VS

财政司司长

我在网上的帖子和问题中找不到太多的帮助来了解纹理检索的进展;希望你能帮我,我相信这一定是件很愚蠢的事


谢谢。

请确保在绑定新的渲染目标后直接调用
Gdx.gl.glClear(…)
,因此在
shadowBuffer.begin()之后直接调用。除此之外,拥有20x20像素的FBO可能不太有用,你可能想考虑使用1024x1024来进行。谢谢,伙计!成功了。我的天,我知道为什么会这样吗/还必须为帧缓冲区添加dispose方法,我不知道libGdx会永远“存储”它们…:/这是为了避免必须重建fbo,例如,查看。关于dispose,请查看:
attribute vec4 a_position;
attribute vec2 a_texCoord0;

varying vec2 v_texCoord;

void main() {
    v_texCoord = a_texCoord0;
    gl_Position = a_position;
}
uniform sampler2D shadowMap;
varying vec2 v_texCoord;

void main() {
    gl_FragColor = texture2D(shadowMap, v_texCoord);
}