ソフトウェアレンダリングはどのように行われますか?


15

リアルタイムソフトウェアベースのラスター化を検討したいと思います。最近はすべてがGPUに向かっていることは知っていますが、ソフトウェアレンダラーを使用するのが理にかなっているゲームがいくつかあります。

例:ボクセルトロン

Voxatronは、ボクセル(小さな立方体など)で作られた世界で行われるアリーナシューティングゲームです。ゲーム内のすべては、メニューやプレーヤーのインベントリなど、仮想128x128x64ボクセルディスプレイに表示されます。よく見ると、インベントリ(スコア/ライフ/弾薬)が地面のオブジェクトの一部に影を落としているのを見ることができます。

私は、ボクセルレンダリングとモデリングツールに長い間取り組んでおり、大規模な冒険アドベンチャーゲームを作成するという究極の目標を掲げています。約半年前、それは私がConfluxのアリーナ射手で行っていた仕事と融合しました。これが結果です。

これは非常にシンプルなゲームです。ほとんどの場合、Robotronは3次元の破壊可能な世界で、間抜けな生き物と一緒に設定されています。破壊性の影響がゲームプレイにどれほど大きな影響を与えるかはわかりませんが、壁の破片を吹き飛ばすのは楽しいことです。また、怖いモンスターから身を隠すための障壁を構築するために使用できる実験的な壁構築ピックアップを追加しました。

ゲームは小さなアリーナで行われます。そのうちのいくつかは、ナイトロアとスマッシュテレビの間にあるアクションセットを備えた部屋を備えています。これは、元の冒険に基づいたデザインの一部であり、テーマの環境を作成するための言い訳です。

特徴:

  • ソフトシャドウを使用したカスタムソフトウェアレンダリング。
  • 内蔵のサウンドおよび音楽シンセサイザー(予告編音楽の作成にも使用)。
  • ゲームの記録の再生と投稿。

1
ゲームへのきちんとしたリンク。GPUでソフトシャドウ取得するためにソフトウェアレンダラーを使用する必要がないことに注意してください。彼はレンダーループ側からパフォーマンスの制限に直面し、1.6 GHzのラップトップやハンドヘルドデバイスなどのより基本的なマシンでは実行できません。
ボボボボ

回答:


11

3Dプロジェクション、カメラのセットアップ、頂点のワールドポジションへの変換など、いくつかの基本的な線形代数を既に知っていると仮定します。そうでない場合は、学ぶべき素晴らしい場所がたくさんあります。ここに私が好きな2つがあります。

ゲームエンジンのアーキテクチャ

  • 基本的な線形代数を簡単に説明しますが、知っておく必要のあるすべてを網羅しています。この本は他の多くの理由からも価値があります。

リアルタイムレンダリング

  • もう少し詳細に説明しますが、ここでもあなたが知る必要があるかもしれないことだけにこだわります。繰り返しますが、私はこれを残りの章で扱われているトピックに推奨します。

3Dオブジェクトを表現して処理する方法がわかったら、それらを画面に描画する方法を見てみましょう。通常、これはスキャンライントライアングルラスタライゼーションテクニックを使用して行われます。実際には非常に単純な概念です。色とUVテクスチャ座標を補間しながら、一度に1つの三角形の1つの行を描画します。このプロセスは、画面上のすべての三角形に対して継続されます。デプスバッファを実装して、順不同のレンダリングを処理することもできます。

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

これについては、次の記事で詳しく説明します。

チュートリアル-ソフトウェアベースのレンダリングの概要:三角形のラスタライズ

ソフトウェアレンダリングスクール:パートI


楽しみのために、次の記事をご覧ください。

Quake 2 Source Code Review 3/4(ソフトウェアレンダラー)


どういたしまして:](プロセスのより詳細な概要についてはこちらをご覧ください:en.wikipedia.org/wiki/Rasterisation
zfedoran

そこにいくつかの良いリンク!
ジョナサンコネル

5

これは非常に広範なトピックです。ただし、2つの基本的な部分があります。グラフィック変換とラスタライズパイプラインの実際の理論と、選択した方法で画面にピクセルを吹き付ける実際の実装ビットです。その上、最適化もあります(特に後者)。

幸いなことに、最初の部分は、最新のハードウェアとAPIによって公開されるグラフィックパイプラインに使用される理論と同じです。これを既に知っている場合、設定されています。そうでない場合は、良い本をお勧めします。これはかなりいいです。

2番目の部分には多くのオプションがあります。これらは、OSとツールチェーンの選択に大きく依存します。WindowsでCまたはC ++を使用している場合、単純にピクセルをGDIビットマップに直接プロットできます(SetPixel単純ですが、痛くて役に立たない低速CreateDIBSectionです。生のバイトの塊を提供し、はるかに高速で操作できます)。

また、DirectDrawサーフェスを取得して書き込むか、Direct3DまたはOpenGLテクスチャに書き込むこともできます。後者の場合でも、ハードウェアを使用しますが、CPUで最終イメージのすべての構成を行い、ハードウェアAPIを使用して結果を画面にコピーする限り、それはカウントされます。最新のPCでは、生のVRAMなどに直接アクセスすることはできません。

さらに詳しく知りたい場合は、より具体的な質問を作成する必要があります。私や他の人が喜んで答えてくれるでしょう。


本の場合:「かなり良い」とはどのくらい良いですか?84ドルはかなりの現金です:)
ジョナサンコネル

私が最も強くお勧めするものです。最も安価なオプションについては、変換パイプラインのDirect3Dドキュメントを参照できます。D3D固有ですが、その95%は一般理論にかなり適用可能です。OpenGL Red Bookのオンラインコピーをチェックアウトすることもできます。それらは時代遅れですが、理論は(再び)まだ適用されます。

0

さて、この質問に非常に基本的なことからアプローチします。それを超えるものは、単純なQAを拡大する方法です。そのテーマに関する本を購入する必要があります。

ソフトウェアでのレンダリングとGPUの使用の最も基本的な違いは、ピクセルのプロットにあります。つまり、ソフトウェアレンダリングを実行するときは、最終的にすべてのいまいましいピクセルをプロットする必要がありますが、GPUではピクセルのプロットはハードウェアによって大幅に自動化され、シェーダーを使用してピクセルパイプラインを「マッサージ」します。

たとえば、画面上に3D三角形を表示するためにプログラマーとして何をしなければならないかを考えてください。GPUを使用すると、頂点のX、Y、Z座標をハードウェアに伝えるだけで、三角形の画像を構成する画面上のすべてのピクセルがビデオカードで埋められます。シェーダーを使用して、テクスチャーなどに基づいてすべてのピクセルの色を変更するようGPUに指示することもできますが、最終的にはGPUがすべてのピクセルを自動的に塗りつぶします。

ソフトウェアレンダリングを行うには、画面上のどのピクセルを塗りつぶすかを計算し、ブリットを実行してそれらのピクセルを実際に塗りつぶす必要があります。つまり、3Dシーンの座標空間からビュー空間に変換するためのマトリックス計算を行ってから、ビュー空間からスクリーンなどにポイントを投影します。

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