在LibGDX中检索FrameBuffer时的黑色纹理

时间:2015-11-14 23:52:35

标签: opengl libgdx framebuffer fbo

在我的程序中,我首先渲染一些相机看到的场景,然后我想将这个场景(Colorbuffer)检索到一个Texture对象,这样我就可以将它绘制成一个占用整个屏幕的Quad。虽然它看起来很愚蠢但想法只是看看纹理是否正常工作,所以我可以在另一个不那么愚蠢的渲染中使用它(我正在尝试应用阴影贴图);可悲的是,它不像我想的那样工作。 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

attribute vec4 a_position;
attribute vec2 a_texCoord0;

varying vec2 v_texCoord;

void main() {
    v_texCoord = a_texCoord0;
    gl_Position = a_position;
}

FS

uniform sampler2D shadowMap;
varying vec2 v_texCoord;

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

我无法通过网上的帖子和问题找到很多帮助,看看纹理检索发生了什么;希望你能帮助我,我相信它一定是非常愚蠢的......

感谢。

0 个答案:

没有答案