1

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で作業しています。

これを成功させた経験のある人はいますか?

4

1 に答える 1

2

への呼び出しglCompressedTexImage2Dが間違っているようです。Pixel Unpack Buffer Object がバインドされている場合、最後の引数はその PUBO へのオフセット (バイト単位) です。allocateこれは、前の呼び出しでバイト 0 からテクスチャ データをアップロードしたため、0 である可能性が非常に高いことを意味します。

于 2015-06-30T08:17:26.407 に答える