glCompressedTexImage2D() および glCompressedTexSubImage2D() で QT の QGLBuffer を使用しようとしていますが、成功しません。
これは、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で作業しています。
これを成功させた経験のある人はいますか?