在我的程序中,我首先渲染一些相机看到的场景,然后我想将这个场景(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);
}
我无法通过网上的帖子和问题找到很多帮助,看看纹理检索发生了什么;希望你能帮助我,我相信它一定是非常愚蠢的......
感谢。