点を描くところから始めるRust製ソフトウェアラスタライザ
GitHub:
Rustでソフトウェアラスタライザを手作りする
DIY
執筆中
環境
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 Rust で 線分 を描く(Rust製ラスタライザ)
AC.icon 描画環境 周りのリファクタリング(Rust製ラスタライザ)
AC.icon Camera の定義とVec4の定義(Rust製ラスタライザ)
AC.icon Rust で 三角形 を書く
空間とポリゴン
AC.icon 4x4行列演算とアフィン変換の定義(Rust製ラスタライザ)
AC.icon 座標変換と三次元空間のポリゴン(Rust製ラスタライザ)
AC.icon depth-bufferingとカリング(Rust製ラスタライザ)
オブジェクト
WJ.icon オブジェクトを作る < Rust製ラスタライザ
WJ.icon 一個のモデルを放物線状に落下させる。
WJ.icon 複数個のモデルを生成しては放物線状に落下させる。
シェーダー
WJ.icon バーテックスシェーダ(に等価な機能をCPUで)実装
VertexShader基底クラスを作る。
何が必要?
Vec4World ---> Vec4Screen
それの一実装として現行のパイプラインを組み込んでおく。
WJ.icon フラグメントシェーダ(に等価な機能をCPUで)実装
FlagmentShader基底クラスを作る。
(Point2, double uni, double vari) ---> Vec4(Color)
それの一実装として現行のパイプラインを組み込んでおく。
発展
WJ.icon 頂点のデータ整理
WJ.icon Transformer・クォータニオンによる姿勢の決定
WJ.icon Phongシェーダを作る
さらに発展的な目標
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以外の用途では許可されている