将OpenGL纹理从一个目标复制到另一个目标

时间:2016-07-11 12:05:51

标签: opengl textures framebuffer glkit iosurface

我有一个IOSurface支持的纹理,仅限于GL_TEXTURE_RECTANGLE_ARB,并且不支持mipmapping。我试图将此纹理复制到另一个绑定到GL_TEXTURE_2D的纹理,然后在该纹理上执行mipmapping。但是我在复制纹理时遇到了问题。我甚至无法通过将其复制到另一个GL_TEXTURE_RECTANGLE_ARB来使其工作。这是我的代码:

    var arbTexture = GLuint()
    glGenTextures(1, &arbTexture)

    /* Do some stuff to fill arbTexture with image data */

    glEnable(GLenum(GL_TEXTURE_RECTANGLE_ARB))
    glBindTexture(GLenum(GL_TEXTURE_RECTANGLE_ARB), arbTexture)
    // At this point, if I return here, my arbTexture draws just fine

    // Trying to copy to another texture (fbo and texture generated previously):
    glBindFramebuffer(GLenum(GL_FRAMEBUFFER), fbo);
    glFramebufferTexture2D(GLenum(GL_READ_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_TEXTURE_RECTANGLE_ARB), arbTexture, 0)
    glFramebufferTexture2D(GLenum(GL_DRAW_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT1), GLenum(GL_TEXTURE_RECTANGLE_ARB), texture, 0)
    glDrawBuffer(GLenum(GL_COLOR_ATTACHMENT1))
    glBlitFramebuffer(0, 0, GLsizei(width), GLsizei(height), 0, 0, GLsizei(width), GLsizei(height), GLbitfield(GL_COLOR_BUFFER_BIT)
        , GLenum(GL_NEAREST))
    glBindTexture(GLenum(GL_TEXTURE_RECTANGLE_ARB), texture)
    // At this point, the texture is all black

1 个答案:

答案 0 :(得分:0)

您的第二个glFramebufferTexture2D()的参数与您的描述不符:

glFramebufferTexture2D(
    GLenum(GL_DRAW_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT1),
    GLenum(GL_TEXTURE_RECTANGLE_ARB), texture, 0)

由于您说第二个纹理是GL_TEXTURE_2D,因此需要通过调用的 textarget 参数进行匹配。它应该是:

glFramebufferTexture2D(
    GLenum(GL_DRAW_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT1),
    GLenum(GL_TEXTURE_2D), texture, 0)

BTW,GL_TEXTURE_RECTANGLE是OpenGL 3.1及更高版本的标准配置,因此不需要使用ARB表格。