【问题标题】:QGLBuffer with Compressed Textures具有压缩纹理的 QGLBuffer
【发布时间】:2015-09-15 18:42:14
【问题描述】:

我正在尝试将 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())。”,但它没有提及其他解包命令,例如 glCompressedTexImage2D()。

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

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

有谁有成功的经验吗?

【问题讨论】:

  • 你能粘贴一些你的代码吗?否则...
  • 添加有效和无效的代码的 sn-ps。希望这有助于改善问题。

标签: qt opengl pbo


【解决方案1】:

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

【讨论】:

  • 你的意思是倒数第二个参数?当我从 glTexImage2D() 切换到 glCompressedTexImage2D() 时,我正在这样做,但这给了我无效值错误。对于最后两个参数,我还尝试了 0/NULL 和实际数据/大小的组合,但它们都不起作用。这是我在研究提到它需要大小和指针的解决方案时遇到的问题。但它虽然没有使用 PBO。 stackoverflow.com/questions/28029700/…
  • 最后一个。请参阅opengl.org/sdk/docs/man/html/glCompressedTexImage2D.xhtml : "如果在指定纹理图像时将非零命名缓冲区对象绑定到 GL_PIXEL_UNPACK_BUFFER 目标(请参阅 glBindBuffer),则 data 被视为字节偏移量到缓冲区对象的数据存储中。”
  • 你是对的,谢谢佩佩!我错过了描述中的那句话。我永远不会认为 void* 在某些情况下会被解释为字节偏移量。
猜你喜欢
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多