ASCII 3Dレンダラーを作る
(kciter.so)ASCII 3Dレンダラーを実装しながら、3Dレンダリングパイプラインについて説明する。
この記事の成果物は、ブログ記事のほかに以下のリンクからも確認できる。
GitHub: https://github.com/kciter/ascii-3d-renderer.js
Chromatic: https://6637eb83d047d2bb1b3cfe67-bdnazvfsel.chromatic.com/?path=/story…
- ASCIIを3Dのように見せることは可能か?
- ASCIIは、大きく拡大した白黒ピクセルに似ている
- 文字の密度に応じて明るさを調整できる
- 3D座標を2D座標にどう変換するのか?
- 大きく分けて、頂点処理、ラスタライズ、フラグメント処理の順で進む
- 3D座標は頂点(vertex)と呼ばれ、3D空間に位置する「頂点」を意味する
- 頂点1つだけでは物体を表現できないため、頂点を集めて物体を表現する
- 物体を表現する最小単位をポリゴンと呼ぶ
- 頂点処理
- 頂点を変形する過程を頂点処理と呼ぶ
- ワールド変換、ビュー変換、射影変換の順で進む
- 各変換は行列を使って計算する
- ワールド変換は、3Dモデルファイルに含まれる頂点を3D空間に配置すること
- ビュー変換はカメラを配置することで、どの座標からどの視点で物体を見るかを計算すること
- 射影変換は遠近感を表現するための計算。通常は透視投影を使う。
- 射影変換によって2D空間座標へ変換できる
- ラスタライズ
- 2D空間座標をピクセル座標に変換する過程
- クリッピング、透視除算、背面除去、ビューポート変換、スキャン変換を経る
- この記事では、これらの作業を適切に組み合わせて実装している
- フラグメント処理
- ピクセルに変換された座標を処理する過程
- 一般的な3Dレンダラーでは、シェーダー演算を行うなどの後処理を進める
- この記事では、光源計算の結果のみを適用している
- 実装パートはほとんどがソースコードのため、この要約では省略
3件のコメント
楽しく読みました。学部時代に受講したコンピュータグラフィックスの授業もいろいろと思い出されて、よかったです。
とても楽しく読みました。カメラの位置まで考慮して作業されていた点が印象的でした。
基本的なレンダリングパイプラインの説明まであり、
とても面白い内容でした。