0

私は最近 VR を使用していて、OpenGL 関連の問題に遭遇しました。VR に使用する API は、ビデオ ストリームをキャプチャしてテクスチャに書き込みます。次に、このテクスチャをヘッドセットに送信します。しかし、API には互換性がありません。ストリームから取得したテクスチャの内部フォーマットは定義されておらず、ヘッドセットに直接送信することはできません。

私は回避策に取り組んでいます。今のところ、GPU -> CPU -> GPU 転送を使用しました: 最初のテクスチャ ピクセルを (glReadPixels で) 読み取り、それらをバッファに書き込み、次にこのバッファを使用してテクスチャを作成します正しいフォーマット。これは問題なく動作しますが、データ転送による遅延が発生します。

直接 GPU コピーを実行しようとしましたが、失敗しました:

  • PBO を使用してみましたが、無効な操作に問題があります ( http://www.songho.ca/opengl/gl_pbo.htmlに従ってください)。

    // Initialization           
    glGenBuffers(1, &pbo);
    glGenTextures(1, &dstTexture);
    glBindTexture(GL_TEXTURE_2D, dstTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glBindTexture(GL_TEXTURE_2D, 0);
    
    // Copy to GPU
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
    glBufferData(GL_PIXEL_PACK_BUFFER, bufferSize, NULL, GL_DYNAMIC_DRAW);
    
    glBindTexture(GL_TEXTURE_2D, id);  // texture given by the API
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    
    glBindTexture(GL_TEXTURE_2D, 0);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
    glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize, NULL, GL_DYNAMIC_READ);
    glBindTexture(GL_TEXTURE_2D, dstTexture);
    
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    
  • FBO を使用しようとしましたが、ポインター例外が発生しました。

  • 最初のテクスチャの内部フォーマットが認識されないため、glCopyImageSubData は機能しません。

GPU の直接コピーを行う手順は?

4

0 に答える 0