Копировать текстуру OpenGL из одной цели в другую

У меня есть текстура с IOSurface, которая ограничена GL_TEXTURE_RECTANGLE_ARB и не поддерживает mipmapping. Я пытаюсь скопировать эту текстуру в другую текстуру, привязанную к GL_TEXTURE_2D, а затем вместо этого выполнить наложение на эту карту. Но у меня проблемы с копированием моей текстуры. Я даже не могу заставить его работать, просто скопировав его в другой 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 ответ

Аргументы твоего второго 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)

КСТАТИ, GL_TEXTURE_RECTANGLE является стандартным в OpenGL 3.1 и более поздних версиях, поэтому не нужно использовать форму ARB.

Другие вопросы по тегам