プログラミング
500行のプレーンC++で実現するソフトウェアレンダリング
Software rendering in 500 lines of bare C++ (haqr.eu)
要約
この記事では、OpenGL、Vulkan、Metal、DirectXといった3DグラフィックスAPIの仕組みを、依存ライブラリなしのC++コードでゼロから実装する過程を解説します。約500行のコードで、テクスチャ付きの3Dモデルから画像を生成するソフトウェアレンダラーを作成し、3Dグラフィックスの基本原理を理解することを目的としています。
全文翻訳
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}; // 注意、BGRA順
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に保存されます。
ティーザー:レンダラーで作成されたいくつかの例
コメント