OpenGL绘制到多个纹理

时间:2015-05-29 16:36:19

标签: java opengl lwjgl

我试图将场景的数据绘制到多个纹理。纹理以颜色形式保持漫反射,法线和位​​置。渲染场景时,只绘制其中一个纹理。 gl_FragData [0]最终在带有附件GL_COLOR_ATTACHMENT2的纹理中。如果我将gl_FragData [0]切换为漫反射,则正常。或者GL_COLOR_ATTACHMENT2纹理的位置是正确的,所以我知道着色器中的数据是正确的,但前两个纹理最终是空白的。

int fbo = glGenFramebuffer();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
addTextureAttachment(GL_COLOR_ATTACHMENT0);
addTextureAttachment(GL_COLOR_ATTACHMENT1);
addTextureAttachment(GL_COLOR_ATTACHMENT2);
Material.unbindAllTextures();

public void addTextureAttachment(int attachment) {
    int id = glGenTextures();
    glBindTexture(GL_TEXTURE_2D, id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer)null);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, id, 0);
    textures.add(new Texture(id, width, height));
}

我在渲染之前调用它

public void bindAsRenderTarget() {
    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glViewport(0, 0, width, height);
    glDrawBuffers(GL_COLOR_ATTACHMENT0);
    glDrawBuffers(GL_COLOR_ATTACHMENT1);
    glDrawBuffers(GL_COLOR_ATTACHMENT2);
}

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。当我调用glDrawBuffers 3次时,我只需要调用一个不同的glDrawBuffers,它接受包含int GL_COLOR_ATTACHMENT 0,1和2的ByteBuffer,如下所示:

    ByteBuffer buffer = BufferUtils.createByteBuffer(3 * 4);
    buffer.putInt(GL_COLOR_ATTACHMENT0);
    buffer.putInt(GL_COLOR_ATTACHMENT1);
    buffer.putInt(GL_COLOR_ATTACHMENT2);
    buffer.flip();

    glDrawBuffers(3, buffer);
相关问题