基本的に、2Dビットマップはどのようにレンダリングされますか?


9

64ビットのワードアドレス指定可能なコンピューターがあり、バイナリイメージのビットマップとして格納されている5x7文字(下図のような)をメモリマップディスプレイに出力するようにプログラムしたいとします。

ここに画像の説明を入力してください ここに画像の説明を入力してください

1文字あたり5 x 7 = 35ピクセルなので、1つの単語に35ビットを使用して文字を格納できます。最下位ビットがワードの左側から始まり、上記のように画像の各ピクセルがn番目のビットで表される場合、上記の数値「3」は、01110100010000100110000011000101110としてメモリに格納され、その後に29が使用されません。ビットは0に設定されています。

これは、キャラクターが古い/現代のコンピューターにどのように保存されているのですか?または、代わりにピクセルごとに1バイト/ワードを使用しますか?

これらがこの方法で格納されている場合、アセンブリ/マシンコードのルーチン(コンピューターの命令セットアーキテクチャーからのビット単位、算術、およびデータ転送操作などの基本命令のみを使用)は、このデータをディスプレイはこんな感じ?それは次のようなものでしょうか?

  1. 更新する現在のピクセルのxおよびy表示座標を特定のレジスタに格納します。
  2. 選択した2つのRGB値(この場合、緑の場合は0、255、0、黒の場合は0、0、0)を他の2つの別のレジスタに保存します。
  3. さらに2つのレジスターを5および7に初期化されたカウンターとして機能させ、レンダリングされるイメージの現在の行と列を追跡します。
  4. 列レジスタが0ではないかどうかをテストします。そうでない場合は、ビットマップのLSBが1に設定されているかどうかをテストし、結果に応じてそれぞれのRGB値レジスタとxおよびy座標レジスタをANDで結合し、その結果をMOVしますディスプレイ出力レジスタに。
  5. 行カウンタレジスタを1だけデクリメントして、0かどうかをテストします。0の場合は、それを5に戻して、y座標を1だけインクリメントし、列カウンタを1だけデクリメントします。
  6. ビットマップを保持するレジスタを1ビット左にシフトします。
  7. JMPから命令へ4。

これを行うためのより簡単またはより効率的な方法はありますか?単一の小さなテキスト文字をレンダリングするような単純なものでさえ、かなりの数の操作を必要とし、約200 CPUサイクルを要するようです。

最後に、マシンレベルのコードにゼロから画像を表示するための優れた書籍やリソースはありますか?この特定の主題について光沢があるか、コードが高級言語で記述されているか、またはマクロを使用するアセンブラ。これらはすべて「不正行為」であり、基本的に最下位レベルで行われていることを説明していません。


3
グラフィックスプログラミングブラックブックは確かに古典的な価値の読みです。多くのオールドスクールブラックマジック;)
ちらつき

はい、マイケル・アブラシュの本を二番目に引用します。それは素晴らしい読みです。この本に書かれていることには袖のトリックがもっとたくさんありますが、その背後にある哲学は重要です(今日までです!)
Romain Piquois

回答:


7

マシンのグラフィックボードのテキストモードとグラフィックモードを区別する必要があります。

昔はほとんどテキストモードがサポートされていました。このモードでは、ボードは文字のビットマップ定義を保存し、現在のカーソル位置に表示します。必要なのは、小さなテキストバッファーに文字のASCIIコード(文字ごとに1バイト)を提供することだけでした。

現在、高解像度のラスターバッファーが提供されており、ピクセルアクセスが可能で、サポートされている形式でカラー情報を書き込むことができます(「最高」モードでは、1ピクセルあたり3バイト(RGB)、メガピクセル以上)。

元々は、さまざまなサイズの単純な(パックされた)バイナリビットマップが使用され、デバイスドライバへの要求を介してラスタメモリに「ブリット」され、可能な形式変換が行われていました。

現在、文字はほとんどがアウトラインの解像度に依存しない説明であるベクトル描画として定義されており、スムーズな結果を得るためにアンチエイリアスを含む複雑なレンダリングプロセスを実行する必要があります。

レンダリングされた出力は、ブリットすることによって、高速表示のためにキャッシュできます。

全体的なプロセスは複雑で、ハードウェアアクセラレーションが可能で、オペレーティングシステム(GUI管理)によって、他のグラフィカルなプリミティブ描画操作と透過的に処理されます。


1

短い答えはイエスです、あなたのフォーマットがそれを必要とするなら、あなたは多くのビット操作をすることを避けることはできません。

ビットマップを描画するということは、基本的には、ピクセルをソースから宛先にコピーすることを意味し、そのために必要なことを行う必要があります。(明らかにキャプテンキャプテン)

より長い答えは、ソフトウェアラスタライザを作成する場合、ソースのピクセル形式を同じにすることで、(描画する必要のない部分(透過性の最適化)を知ることにより)アルゴリズムとトリックを使用してCPU時間を節約できるということです宛先として(直接またはキャッシュの形式で)、最適にmemcopyなどを実行します。基本的には、ラスタライザの描画ループを検討し、それらを再構築してCPU時間を節約する方法を確認します(例:実行時に生成できます。具体的には、文字Aを印刷するためのアセンブラコードの一部、または透明な領域をスキップする方法などを示すためにソースビットマップ情報にメタを持たせるなど。)ユースケースごとに、CPU命令セット、バッファ形式、レンダリングプリミティブのアルゴリズム(回転、ビットマップのストレッチ、フィルタリングの種類など)、CPUレジスタ、キャッシュなど...

とにかく、とにかく、奇妙なエンコーディングと小さなメモリが当たり前だった昔は、単一のピクセルを書き込むのに多くのCPUサイクルを要しました。:-)しかし、8 MHZ CPUを搭載した16/32ビットマシンがそのようなことを行うことを禁止していませんでした:https : //www.youtube.com/watch?v=GWwPJU6pp30(そしてCPUの大きなチャンクも使用されました音楽用)

HWレンダリングの場合、HWはソース形式から宛先形式への変換を実行します。SWラスタライザで利用できるトリックの多くは使用しませんが、HWでのその一般的な実装は、ほとんどのSW実装よりも優れています。

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