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