点を描くところから始めるRust製ソフトウェアラスタライザ
GitHub:
rusterizer-from-dots: 点を描くところから始めるRust製ソフトウェアラスタライザ
Rustでソフトウェアラスタライザを手作りする
https://gyazo.com/c0c01cb5c306ea50e46fe8fd4841ecc0
DIY
執筆中
注意:この記事はチュートリアルではないです
自分の開発記録を残しているだけです
そのため、何度か手戻りが発生していたりしていて、チュートリアルとするにはあまりにもまどろっこしい内容となっていますappbird.icon
環境
Mac OS Sonoma v16.4.1
Apple M2 Pro
前提とする機能
ウィンドウを表示する
ウィンドウの1画素を指定して、その画素の色を指定した色に置き換える。
Result draw_pixel(pixel p)
画像のロード
必要となる知識
Rust・Cargoのインストール
CGに関する線形代数の知識
つまり、理論はなんか知ってるけど実際ラスタライザってどう作るん?という状況appbird.icon
過去に一回Javaで作ったことはある
ソフトウェアラスタライザを点を描くところから作成する。
Rustでもやってみようじゃないかということでやってみるappbird.icon
到達点
できるだけシンプルな実装を目指す。
最適は目指さず、必要があれば愚直な手段を取る
Rustの学習ついでにやっていることなので、書かれているコードはアルゴリズム的にもRustの作法的にも最適でない
三次元空間にある三角形ポリゴンを表示できるようにする
三角形ポリゴンで構成されたオブジェクト(モデル)を三次元空間上に配置し、特定の位置から表示できるようにする
バーテックスシェーダー・頂点シェーダに等価な機能を作る
頂点ごとに色を指定して、ピクセルシェーダー・フラグメントシェーダを作る
やらないこと
高速化
コードは綺麗に書かない(人に教えることを目的として記事を書かない)
(---> 時間がかかりすぎる、やるなら後で)
方針
インクリメンタルな開発を取る。
結果の可否はエラーではなくResult型で表す
先行事例
black
参考資料
GLFWによるOpenGL入門
クレート
記法
$ \div ... 整数除算
$ / ... 実数除算
マイルストーン 兼 開発ログ
はじめに
AC.icon プロジェクトのセットアップ
AC.icon GitHubにリポジトリを上げる
AC.icon Rust で 画面 の 描画 に使えるライブラリとその基本的な使用方法
平面
AC.icon 描画環境 周りのリファクタリング < rusterizer-from-dots
AC.icon Camera の定義とVec4の定義 < rusterizer-from-dots
AC.icon Rust で 三角形 を書く < rusterizer-from-dots
おまけ
AC.icon Rust で 線分 を描く < rusterizer-from-dots
空間とポリゴン
AC.icon 4x4行列演算とアフィン変換の定義 < rusterizer-from-dots
AC.icon 座標変換と三次元空間のポリゴン < rusterizer-from-dots
AC.icon depth-bufferingとカリング < rusterizer-from-dots
オブジェクト
AC.icon オブジェクトを作る < rusterizer-from-dots
AC.icon 一個のモデルを放物線状に落下させる。
AC.icon 複数個のモデルを生成しては放物線状に落下させる。
より複雑なレンダリング:フォグとテクスチャマッピング
AC.icon 深度とフォグ < 点を描くところから始めるRust製ソフトウェアラスタライザ
AC.icon メッシュレンダラへの責任分離 < 点を描くところから始めるRust製ソフトウェアラスタライザ
AC.icon 頂点のデータ整理
AC.icon テクスチャマッピング < 点を描くところから始めるRust製ソフトウェアラスタライザ
地球を描く:シェーディング・ライティング
AC.icon バーテックスシェーダー・フラグメントシェーダーで構成されたレンダリングパイプライン < 点を描くところから始めるRust製ソフトウェアラスタライザ
AC.icon gltfクレートによる3Dモデルの読み込み(とバグ取り) < rusterizer-from-dots
デバッグのために毎フレーム出てくる情報を見やすく整備する < rusterizer-from-dots
WJ.icon Phongシェーディング < rusterizer-from-dots
応用に向けて
WJ.icon クォータニオンによる姿勢の決定
WJ.icon
さらに発展的な目標
WJ.icon 水面を描く
https://qiita.com/flankids/items/ca0aaa89aa0049aa0429
https://qiita.com/uynet/items/f8b087d47f5cf316eb7e
https://esprog.hatenablog.com/entry/2018/01/10/000942
https://tsumikiseisaku.com/blog/shader-tutorial-refraction/
WJ.icon FBXモデルを読み込む
WJ.icon スケルタルアニメーション
WJ.icon テクスチャとマテリアル
例えばプラチナちゃんを読み込むことを課題にしてはどうかappbird.icon
様々な用途に利用できる3Dデータです。素体、表情アニメーション、改変用ファイルなどが付属。
VRChat以外の用途では許可されている