500行の純粋なC++によるソフトウェアレンダリング
この連載記事では、OpenGL、Vulkan、Metal、DirectXの動作を、簡易版をゼロから作成することで解説することを目指します。 驚くほど多くの人が3DグラフィックスAPIを学ぶ最初のハードルでつまずきます。 それを助けるため、私は短い一連の講義を用意しました。この講義の後、私の生徒たちはかなり高機能なレンダラーを制作できるようになります。
課題は次のとおりです。サードパーティ製ライブラリ(特にグラフィックス関連のもの)を一切使わずに、以下のような画像を生成します。

警告:これは現代の3Dグラフィックスライブラリの構造を緩やかに踏襲した学習教材です。 これはソフトウェアレンダラです。 私はGPUアプリケーションの書き方を示すつもりはなく、それらがどのように動作するかを示したいのです。 私は、3Dライブラリを使って効率的なアプリケーションを書くためには、この理解が不可欠であると強く信じています。
出発点
完成したコードは約500行です。 私の生徒は通常、10〜20時間のプログラミングでこのようなレンダラーを制作し始めます。 入力は、三角形メッシュとテクスチャで構成された3Dモデルです。 出力はレンダリング画像です。 グラフィカルインターフェースはなく、プログラムは単に画像を生成します。
外部依存を最小限に抑えるため、私は生徒にTGAファイルを取り扱うための単一のクラスを提供しています。これはRGB、RGBA、グレースケール画像をサポートする最もシンプルなフォーマットの1つです。 これは画像操作の基盤となります。 最初に利用可能な機能は、画像の読み込みと保存以外に、単一のピクセルの色を設定する機能だけです。
線分や三角形を描画するための組み込み関数はありません。すべてを手動で実装します。 私は生徒と一緒に書いた独自のソースコードを提供しますが、それらを直接使用することは推奨しません。自分で作業することが概念を理解するために不可欠だからです。 完全なコードはgithubで入手可能で、生徒に提供する初期ソースコードはこちらからご覧いただけます。 さあ、出発点はこちらです。
main.cpp#include "tgaimage.h"
constexpr TGAColor white = {255, 255, 255, 255}; // attention, BGRA order
constexpr TGAColor green = { 0, 255, 0, 255};
constexpr TGAColor red = { 0, 0, 255, 255};
constexpr TGAColor blue = {255, 128, 64, 255};
constexpr TGAColor yellow = { 0, 200, 255, 255};
int main(int argc, char** argv) {
constexpr int width = 64;
constexpr int height = 64;
TGAImage framebuffer(width, height, TGAImage::RGB);
int ax = 7, ay = 3;
int bx = 12, by = 37;
int cx = 62, cy = 53;
framebuffer.set(ax, ay, white);
framebuffer.set(bx, by, white);
framebuffer.set(cx, cy, white);
framebuffer.write_tga_file("framebuffer.tga");
return 0;
}
これは64x64の画像 framebuffer.tga を生成します。ここでは読みやすくするために拡大しています。

コンパイル
git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
cmake -Bbuild &&
cmake --build build -j &&
build/tinyrenderer obj/diablo3_pose/diablo3_pose.obj obj/floor.obj
生成された画像は framebuffer.tga に保存されます。
ティーザー:レンダラで作成されたいくつかの例




0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.