带压缩纹理的QGLBuffer

时间:2015-06-29 10:28:17

标签: qt opengl pbo

我试图将QT的QGLBuffer与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

但是,如果我像这样使用带有glCompressedTexImage2D()的PBO:

        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())。",但它没有提及任何有关其他解包命令的信息。 as glCompressedTexImage2D()。

我在网上搜索了QGLBuffer和glCompressedTexImage2D()上的更多文档,但却找不到同时使用它们的任何内容。

我使用QT4.8在linux下工作。

任何人都有成功的经验吗?

1 个答案:

答案 0 :(得分:2)

PCDATA的调用看起来不对。当绑定Pixel Unpack Buffer Object时,最后一个参数是该PUBO的偏移量(以字节为单位)。这意味着它应该很可能为0,因为您在之前的glCompressedTexImage2D调用中从字节0上传了纹理数据。