概要
- OpenGL や DirectX などの3DグラフィックスAPIの仕組みを学ぶための ソフトウェアレンダラー 作成手順
- 外部ライブラリ不使用 で500行程度のC++コードのみで実装
- TGA画像操作クラス のみ提供、ピクセル単位で描画を実装
- 学習目的であり、 GPUプログラミング そのものではなく仕組みの理解が主眼
- 完成コードとサンプル画像は GitHub で公開
500行C++によるソフトウェアレンダリング入門
-
OpenGL や Vulkan、 Metal、 DirectX の動作原理を理解するための簡易クローン実装
-
多くの人が3DグラフィックスAPIの最初の壁でつまずく現状
-
独自講義を通じて、学生が自力でレンダラーを作れるようになることを目指す教材
-
第三者製グラフィックス関連ライブラリは一切不使用
-
目標:三角形メッシュとテクスチャから画像を生成するシンプルな3Dレンダラー作成
- 出力は 画像ファイル のみ、GUIなし
- TGAファイル操作クラス を唯一の外部依存として提供
- 最初に使える機能は「ピクセル単位で色をセットする」だけ
- 線分や三角形描画機能も含めて全て手作業で実装
-
自分で手を動かすことが理解の本質 であり、提供コードをそのまま使うのは推奨しない方針
-
完成コードは GitHub で公開、学生向けの初期コードも別途提供
-
main.cpp の例
- 64x64ピクセルのTGA画像を生成
- 3点の座標に白色ピクセルを描画
- コード例:
#include "tgaimage.h" constexpr TGAColor white = {255, 255, 255, 255}; // BGRA順 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; }
-
コンパイル方法 例
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として保存
-
完成サンプル画像 もGitHubで公開中
教材の目的と注意点
- 本教材は 現代的な3Dグラフィックスライブラリの構造 を緩やかに踏襲
- GPUアプリケーションの書き方 ではなく、内部動作の理解を重視
- 3Dライブラリを効率的に使いこなすための基礎知識 習得が目的
- 自作レンダラーを通して本質的な仕組みを体感 する学習体験を推奨