miniRT

2025.05

C言語で実装したレイトレーサー

CRay TracingGraphics

概要

C言語でレイトレーシングエンジンを2人チームで開発。 カメラからピクセルごとにレイを生成し、シーン内オブジェクトとの交差判定を行い、Phongライティングモデルで色を決定するレンダリングパイプラインを実装した。 球体・平面・円柱のプリミティブに対応し、再帰レイトレーシングによって鏡面反射や屈折を表現。拡張性を意識した設計により、Diffuseに加えてMirror・Metal・Glassの4種類のマテリアルを実装した。

miniRTminiRTminiRT

担当範囲

  • レンダリングのメインループおよびカメラからのレイ生成
  • Phongライティング(環境光・拡散反射・鏡面反射)の実装
  • 球体・平面の交差判定アルゴリズム
  • ベクトル演算・RGB演算の基盤実装
  • minilibxを用いたウィンドウ処理

ポイント

  • 処理を分離したパイプライン設計による拡張性の確保
  • 数式を分解し解釈した上で実装・デバッグに活かした
  • インタフェース設計による並行開発の安定化

苦労・工夫した点

レイトレーシングの実装にあたり、「レイ生成 → 交差判定 → ライティング」の各処理が分離されていない構造では、機能追加時に影響範囲が広がると考えた。そのため、各処理を独立したステージとして分離するパイプライン構造を採用し、責務を明確化した。この設計により、新しいプリミティブやマテリアルの追加時に既存コードへの影響を最小化し、各処理のデバッグを個別に実施可能にした。 また、交差判定やライティング計算では、数式をそのまま実装するのではなく、幾何学的な意味に分解して理解した上で実装した。これにより、描画結果から計算課程を逆算してバグの原因を特定できるようになり、計算を含む処理でも効率的にデバッグを進められた。 チーム開発ではレンダリングとパーサーで役割分担し、共有インターフェースを定義して統合する設計を採用。インターフェースを先に定義することで並行開発時の実装の衝突を防ぎ、スムーズな統合を実現した。