RGBA8888に変換するときにRGB565の上位ビットを複製する理由


7

一部のコンピューターグラフィックスソフトウェアのコードベースで、RGB565形式の画像データの上位ビットが、上位ビット深度形式のRGBA8888に変換すると、下位ビットに複製される場合があることを確認しました。

たとえば、このgamedev.netスレッドでユーザー「eq」によるコメントを見つけました。

上位ビットを未定義の下位ビットに複製することを好みます:
R8 =(R5 << 3)| (R5 >> 2);

しかし、その理由はよくわかりません。

これらのビットを変換されたデータに複製する目的を何が使用しますか?


1
ビットを複製しない場合、LSBは0になるため、最大値0x1f(5ビットの最大値)の場合、8ビットに変換すると0xf8に拡張されます。必要なのは0xffなので、0x00-> 0x1fの範囲は0x00-> 0xf8ではなく0x00-> 0xffにマッピングされます。
PaulHK 2018年

2
@PaulHK回答として投稿してください。現状では完全ですが、コメントとしては検索できません。
Dan Hulme

はい、ありがとう@PaulHKこれは私の質問に正しく答えます
wip

回答:


7

ビットを複製しない場合、LSBは0になるため、最大値0x1f(5ビットの最大値)の場合、8ビットに変換すると0xf8に拡張されます。必要なのは0xffなので、0x00-> 0x1fの範囲は0x00-> 0xf8ではなく0x00-> 0xffにマッピングされます。LSBをマージしないと、0x1f、0x1f、0x1fを白(0xff、0xff、0xff)に変換できません。ちなみにこれはN * 0xff / 0x1fと同じです。

Example: 

left shift only (<< 3)
%---00001 -> %00001000     (0x01 -> 0x08)
%---10000 -> %10000000     (0x10 -> 0x80)
%---11111 -> %11111000     (0x1f -> 0xf8)

merging MSB to LSB 
%---00001 -> %00001000     (0x01 -> 0x08)
%---10000 -> %10000100     (0x10 -> 0x84)
$---11111 -> %11111111     (0x1f -> 0xff)

7

実際には、ビット複製を行うためのかなり良い数学的理由があります。

最初に、nビット文字列は実際には値を表し、mビット文字列を生成することに注意してください。ここで、および NN21M<メートル

N21M2メートル1

最初に分子と分母をスケーリングします

N2+1212+1M2メートル1
そしてこれは
N2+1221M2メートル1

あなたの場合、 {56} そして メートル=8 ここで「停止」できますが、m >> nの場合、プロセスを繰り返すことができます(悪心)。

次に、近似を行います...

N2+122M2メートル
単純化する
N2+122メートルM

ご了承ください N2+1 は、nビットの文字列を繰り返して2nビットの文字列を作成することと同じです。 2メートル Mビットの結果を残すLSB。

QED

もちろん、「正しい」計算は M=2メートル1N21+12しかし、この概算は、通常、ほとんどの場合機能します。もちろん、不正確な場合もありますが、IIRCは1ビットだけで比較的まれです。


2
素敵な数式で詳細な説明をありがとうございます。近似によって導入されるエラーに興味があったので、両方の数式を比較するこのグラフを作成しました:desmos.com/calculator/cvaqofyvbf。ただし、PaulHKの方が理解しやすいので、答えを選びます。
2018年

1
軽微な問題。m> = 2nの場合、「近似」方程式を変更する必要があります。極端な例として、n = 1の場合、ストリングを8回繰り返す必要があります(つまり、log2(8)= 3ステップを実行します)。あなたの場合はもちろん、パッド「10 ... 0」ではなく、すべてゼロのと、その後、平均的に、あなたは下のエラーを持っていますが、両極端を失うことになります。「しかし、私はPaulHKの答えを好む」:-)さて、味8Pの説明はありません。
Simon F
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.