3

できれば GPU 上で、GL_RGBA フレームバッファ テクスチャを GL_COMPRESSED_RGBA テクスチャに変換する方法を探しています。フレームバッファは明らかに GL_COMPRESSED_RGBA 内部フォーマットを持つことができないため、変換する方法が必要です。

4

2 に答える 2

5

OpenGL テクスチャ圧縮について説明しているこのドキュメントを参照してください。一連の手順は次のようになります (これはハックです。テクスチャ全体のバッファ オブジェクトを使用すると、状況が多少改善されます)。

GLUint mytex, myrbo, myfbo;

glGenTextures(1, &mytex);
glBindTexture(GL_TEXTURE_2D, mytex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA, width, height, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, 0 );

glGenRenderbuffers(1, &myrbo);
glBindRenderbuffer(GL_RENDERBUFFER, myrbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, width, height)

glGenFramebuffers(1, &myfbo);
glBindFramebuffer(GL_FRAMEBUFFER, myfbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
    GL_RENDERBUFFER, myrbo);

// If you need a Z Buffer:
// create a 2nd renderbuffer for the framebuffer GL_DEPTH_ATTACHMENT 

// render (i.e. create the data for the texture)

// Now get the data out of the framebuffer by requesting a compressed read
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA,
    0, 0, width, height, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glDeleteRenderbuffers(1, &myrbo);
glDeleteFramebuffers(1, &myfbo);

// Validate it's compressed / read back compressed data
GLInt format = 0, compressed_size = 0;
glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format);
glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, 

char *data = malloc(compressed_size);
glGetCompressedTexImage(GL_TEXTURE_2D, 0, data);
glBindTexture(GL_TEXTURE_2D, 0);
glDeleteTexture(1, &mytex);

// data now contains the compressed thing

テクスチャに PBO オブジェクトを使用する場合は、malloc().

于 2012-05-02T14:47:23.230 に答える
4

CPUに転送せずにGPUで圧縮を実行したい場合は、OpenGL(DXベース)に再利用できる可能性のある2つのサンプルを次に示します。

  1. GPUで高速化されたテクスチャ圧縮
  2. GPUアクセラレーションテクスチャ圧縮2

お役に立てれば!

于 2012-05-02T13:39:34.643 に答える