BC6 / BC7テクスチャを反転するには?


8

OpenGLテクスチャにDDS画像ファイルをロードするためのコードがいくつかあります。D3D11で導入されたBC6およびBC7圧縮形式をサポートするように拡張したいのですが。DirectXとOpenGLは、テクスチャの起点が左上隅か左下隅かについて意見が分かれているため、DDSローダーは、ピクセルをOpenGLに渡す前に、Y軸に沿って各画像のピクセルを反転します。

圧縮されたテクスチャを反転すると、追加のしわが生じます。4x4ピクセルブロックの各行を反転することに加えて、各ブロック内のピクセルを反転する必要もあります。私はここで BC1 / BC2 / BC3ブロックをフリップするコードを見つけました。MSDNのブロック図から、BC3フリッピングコードをBC4およびBC5を処理するように適合させるのは簡単でした。BC6BC7フォーマットはかなり多くても、威圧的に見えます。これらの形式を反転するための同様のビット調整のトリックはありますか、または各ブロックを完全に解凍して再圧縮する必要がありますか?

更新:テクスチャの座標がエクスポート時に誤って反転されていたため、テクスチャの反転が必要だったことがわかりました。両方のフリップを削除すると、コードが単純かつ高速になりました(Humusに感謝します!)。BC6 / BC7ブロックを反転することは、興味深い課題である可能性がありますが、元のシナリオとは関係ありません。


1
テクスチャ画像の代わりにテクスチャ座標を反転する場合、同じメッシュ/シェーダーでFBOを使用できないことに注意してください。
msell 2012

それは本当です。DDSテクスチャを残すこともようなツールで上下逆に表示されるように、それらの原因となるunflipped gDEBuggerを。Hrm。
postgoodism 2012

回答:


6

完全な解凍と再圧縮よりもはるかに少ない作業でBC6-7ブロックをフリップすることは確かに可能だと思いますが、それでもピクニックではなく、BC1-5ブロックをフリップするよりもはるかに複雑です。

まず、BC6-7には、ブロックごとに選択できるさまざまなモードがあります。モードのバイナリレイアウトは完全に異なるため、モードごとに異なるフリップルーチンを作成する必要があります(全部で〜20あり、IIRCです)。

別の問題は、ブロック内のピクセルがそれぞれ独自のRGBラインセグメントを持つ2つまたは3つのサブセットに分割される分割モードです。パーティションは事前定義されたセットから選択する必要があります。BC6のものはここで見ることができます。問題は、このパーティションセットが垂直フリップでは対称的でないことです。ただし、垂直フリップと2つのサブセットの入れ替えのいくつかの組み合わせの下では、対称であると思います。たとえば、そのリンクのパーティション#22(6行目、3列目)を見ると、テーブルに垂直方向に反転したバージョンはありませんが、垂直方向に反転して0と1を入れ替えると、パーティション#9(3行目、2列目)になります。私はすべてのパーティションがこのように反転できることを確認していませんし、BC7のパーティションもチェックしていません(これには3つのサブセットを持つパーティションも含まれます)。

それがうまくいくとしても、あなたはまだ家から解放されていません。BC1-5では、RGBラインセグメントの2つのエンドポイントの順序を使用してモードを切り替えましたが、BC6-7では、エンドポイントの順序を選択して、各パーティションサブセットのピクセルごとのインデックスの1ビットを固定しました。したがって、周りのパーティションを変更した場合、エンドポイントの順序を入れ替える必要がある場合もあります。

そして最後に重要なことですが、BC6-7では、エンドポイントはしばしばデルタ圧縮されます(つまり、1つのエンドポイントは完全な精度で保存され、他のエンドポイントはそこからの低精度のデルタとして保存されます)。パーティションのサブセットとエンドポイントの順序を入れ替えると、高精度のエンドポイントが切り替わります。そのため、低精度のビットをシャッフルして、一部のデルタを無効にする必要があります。

全体として、基本的なショートッパーはないようです(実際にはコードを記述していません)が、これらの形式を反転または回転させるのは確かに多くの作業になります。可能であれば、圧縮するにアートパイプラインで画像を反転することをお勧めします。

(ところで、私が見つけたBC6-7の完全な仕様はARB_texture_compression_bptc 仕様です。また、BCnフォーマットについてのブログ記事以前に書きまし。)


ありがとう。私は十分に怖がっています。私は実際にあなたのブログ投稿を探しに行きましたが、リンクを思い出せませんでした。BCnに関するすべての優れたリソースです。それだけでも賛成票を投じる価値があります。
postgoodism 2012

0

フリッピングは、2つのフォーマットのデフォルトの問題です。あなたはデフォルトに対して行くことができます。

OpenGLは低レベルであるため、これはおそらくOpenGL側で行う方が適切であり、したがって、このようなことを行っても最適化を失う可能性は低くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.