1

解凍せずにその場で垂直方向に反転する必要がある PVRTC 4bpp 画像データがあります。私が書いたコードはほとんど機能していますが、フリップは現在小さなアーティファクトを導入しており、正確な理由はわかりません.

PVRTC フリップ コードは、最初に 8 バイトの 4x4 圧縮ブロックを、PowerVR SDK の PVRTDecompress.cpp の TwiddleUV() 関数によって計算された反転位置に移動します。この部分は正しいようです。

次に、コードは、2bpp で格納された 4x4 変調データを含む 2 番目の 4 バイトの順序を逆にして、すべての 8 バイト圧縮ブロックを反復処理します。ブロックの最初の 4 バイトには、変更されないままのカラー データが含まれます。

これは非常に正しいように見えますが、元の画像にはなかった小さなアーティファクトが反転した画像に残り、ほとんどが小さな灰色がかった水平線として現れます。フリッピング コードが 2 回実行されると、アーティファクトはなくなり、画像は元の画像から変更されません。

PVRTC の経験がある人なら、圧縮された画像データを反転するために他に何をする必要があるか説明できますか? 問題は変調データの反転に関係している可能性があると思いますが、私が PVRTC のドキュメントを調べても、この段階では答えが得られませんでした。

4

1 に答える 1

2

これを理解しやすくするには、ETC1 や S3TC/DXTC などのブロックベースのスキームとは少し異なるため、PVRTC がデータをデコードする方法を知っておく必要があります。簡単にするために、4bpp バリアントのみを説明します。

PVRTC は、最終テクスチャの解像度の 1/4 * 1/4 である 2 つの低解像度 15/16bpp 画像 A と B と、フル解像度の 2bpp 変調画像で構成されます。テクセル XY を「論理的に」デコードするには、A 画像と B 画像をターゲット解像度にバイリニアでアップスケールし、結果の色 Axy と Bxy を変調画像のピクセルに従ってブレンドします。ハードウェアでのデコードを簡単にするために、A イメージと B イメージは、変調データから 16 個のピクセルをそれぞれ 1 ピクセルずつ 64 ビット ワードにインターリーブします。

現在、ビット シャッフルだけを使用して正確に反転していない理由は、4x4 バイリニア アップスケールが 4x4 テクセルの中心からわずかにずれているためです (理由は、ウィキペディアからリンクされている Graphics Hardware 2003 の論文に記載されていると思います)。あなたができる唯一のことは、実際に各ピクセルを評価し、バイリニアカラーの反転を行った後、4つの可能性のうちどれが実際に最も近いかを判断することだと思います. ある意味では再圧縮ですが、比較的速いはずです。

于 2012-10-21T12:31:28.577 に答える