2

この 2 日間、DDS フォーマットを研究し、DDS テクスチャ ローダーを書いていたのですが、好奇心だけで、「ピッチ計算式」という当たり前のことに出くわしました。正当な理由もなく、それらがそのまま正確に指定されている理由について、私は本当に興味があります。

たとえば、すべて S3TC に基づくブロック圧縮形式 (DXT#n、BC#n) の場合、計算方法は次のようになります。

max( 1, (幅+3) / 4 ) * ブロックサイズ

したがって、max は 2 つの値のうち大きい方を示しますが、なぜそれが機能するのでしょうか? テクスチャの幅に 3 を追加してから、「ニブル境界」に分割するのはなぜですか?

一方、いくつかのレガシータイプは次のとおりです。

((幅+1) >> 1) * 4

したがって、右シフトは基本的に基数をバイナリベースで移動するか、2 で割ることです。では、なぜ 1 を足してから 2 で割って 4 を掛けるのでしょうか? 右端の 2 ビットを失うには?

最後に、他の形式の場合:

( 幅 * bpp + 7) / 8

ピクセルあたりのビット数と最も近いバイト境界分割は理解していますが、なぜ 7 を追加するのですか?

誰かがこれについてもう少し書くことができますか? または、私を正しい方向に向けますか?

4

1 に答える 1

1

一部の形式では任意の幅のデータを格納できないため、これらの計算は切り上げられます。切り上げることが重要です。そうしないと、テクスチャからピクセルが失われます。通常、加算は除算される数値より 1 少ないことに注意してください。整数の除算は通常切り捨てられるため、除数より 1 少ない数を追加すると、正確な倍数以外の数値は次の値に丸められます。

たとえば、3 を足して 4 で割ると、次のようになります。

  • 1 = 1
  • 2 = 1
  • 3 = 1
  • 4 = 1
  • 5 = 2
  • 6 = 2

残りの計算では、それぞれの形式のストレージ要件が考慮されます。DXT 圧縮の場合、ピクセルの 4x4 ブロックが存在するため、サイズは 4 ピクセルのチャンクであり、各ブロックは一定のバイト数 (blockSize 乗数) を使用します。

2 番目の計算では、2 ピクセルの倍数に丸めてから 4 を掛けます。これはおそらく、ピクセルが 2 バイト幅で、ラインが 4 バイトの倍数でなければならない 16 ビット ピクセル形式を示唆しています (したがって、2 ピクセルの倍数) )

于 2012-12-27T17:57:51.930 に答える