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
вызов.