我正在尝试将 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 下工作。
任何人都有成功做到这一点的经验吗?