QGLBuffer со сжатыми текстурами

Я пытаюсь использовать QGLBuffer из QT с glCompressedTexImage2D() и glCompressedTexSubImage2D(), но безуспешно.

Это рабочий сегмент кода с использованием QGLBuffer и glTexImage2D():

        auto pbo = new QGLBuffer(QGLBuffer::PixelUnpackBuffer);
        pbo->create();
        pbo->bind();
        pbo->allocate(image->pixelsData(), image->pixelDataSize());
        // pixelsData() returns std::vector.data() of uncompressed data,
        // pixelDataSize() returns size of the vector

        GLuint imageTex;
        glGenTextures(1, &imageTex);
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, imageTex);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glPixelStorei(GL_UNPACK_ALIGNMENT,1);
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
                     0,
                     GL_RGBA,
                     image->width(), image->height(),
                     0,
                     GL_RGBA, GL_UNSIGNED_BYTE,
                     0);

        pbo->release();

и это еще один сегмент кода, использующий сжатые данные изображения, который также работает:

        GLuint imageTex;
        glGenTextures(1, &imageTex);
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, imageTex);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glPixelStorei(GL_UNPACK_ALIGNMENT,1);

        glCompressedTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
                               0,
                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
                               image->width(), image->height(),
                               0,
                               image->pixelDataSize(),
                               image->pixelsData());

        // pixelDataSize() in this case returns std::vector.data() of image compressed to DXT1
        // and pixelDataSize() returns the compressed size
        // saw in another post that you can't pass in NULL and 0 for compressed texture

Однако, если я использую PBO с glCompressedTexImage2D(), вот так:

        auto pbo = new QGLBuffer(QGLBuffer::PixelUnpackBuffer);
        pbo->create();
        pbo->bind();
        pbo->allocate(image->pixelsData(), image->pixelDataSize());

        GLuint imageTex;
        glGenTextures(1, &imageTex);
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, imageTex);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glPixelStorei(GL_UNPACK_ALIGNMENT,1);

        glCompressedTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
                               0,
                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
                               image->width(), image->height(),
                               0,
                               image->pixelDataSize(),
                               image->pixelsData());

        pbo->release();

Я получил недопустимую ошибку операции. Документы QGLBuffer говорят, что он предназначен для "записи данных пикселей на GL-сервер (например, с помощью glTexImage2D()).", Но ничего не упоминает о других командах распаковки, таких как glCompressedTexImage2D().

Я искал в Интернете больше документов как по QGLBuffer, так и по glCompressedTexImage2D(), но не смог найти что-либо об их использовании одновременно.

Я работаю под Linux, используя QT4.8.

Кто-нибудь имеет опыт делать это с успехом?

1 ответ

Решение

Призыв к glCompressedTexImage2D выглядит неправильно. Когда Pixel Unpack Buffer Object привязан, последний аргумент - это смещение (в байтах) в этом PUBO. Это означает, что он, скорее всего, должен быть 0, так как вы загрузили данные текстуры из байта 0 в предыдущем allocate вызов.

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