从渲染缓冲区切换到深度纹理

时间:2013-06-10 01:09:16

标签: opengl textures lwjgl depth-buffer

这是我创建新FBO的代码。现在,我正在使用渲染缓冲区。

/**
 * Creates a new FBO.
 * @param width The width of the FBO to create.
 * @param height The height of the FBO to create.
 * @return an int[] array containing the buffer IDs in the 
 * following order: {frameBufferID, colorBufferID (texture), depthBufferID}.
 */
public static int[] newFBO(int width, int height) {
    int[] out = new int[3];
    out[0] = glGenFramebuffersEXT();
    out[1] = glGenTextures();
    out[2] = glGenRenderbuffersEXT();

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, out[0]);

    glBindTexture(GL_TEXTURE_2D, out[1]);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, org.lwjgl.opengl.GL12.GL_TEXTURE_MAX_LEVEL,20);
    glTexParameteri(GL_TEXTURE_2D, GL14.GL_GENERATE_MIPMAP,GL_TRUE);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null);

    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, out[1], 0);

    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, out[2]);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL14.GL_DEPTH_COMPONENT24, width, height);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, out[2]);

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

    return out;
}

我想将渲染/深度缓冲切换到深度纹理。我会做什么改变呢? (我正在使用LWJGL)

1 个答案:

答案 0 :(得分:1)

首先,生成纹理而不是渲染缓冲区:

out[2] = glGenRenderbuffersEXT();

变为:

out[2] = glGenTextures();

接下来,为它创建存储(而不是渲染缓冲区):

glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, out[2]);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL14.GL_DEPTH_COMPONENT24,
                         width, height);

变为:

glBindTexture(GL_TEXTURE_2D, out[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT24, width, height,
             0, GL_DEPTH_COMPONENT, GL_INT, (java.nio.ByteBuffer) null);

最后,将此纹理绑定到帧缓冲区而不是renderbuffer:

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
                             GL_RENDERBUFFER_EXT, out[2]);

变为:

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
                          GL_TEXTURE_2D, out[2], 0);