/vhHairShadow

An example of real-time rendering with OpenGL 3.x for hair-shaped objects.

Primary LanguageC++

About this repository

This project is a research project focusing on computer graphics. The program allos users to render volumetric shadows of hair-shaped objects with following algorithms.

  • Opacity Shadow Maps
  • Deep Opacity Maps
  • Shadow Map

However, when I write this program, I did not have enough skill to generate cmake or Scons files, so that there is no compile support systems in this repository.

If you have any questions, please don't hesitate to send me messages about this repository.

Thank you.

vhHairShadowについて

このプログラムは,池田が卒論~修論にかけて使用していたプログラムになります. 今回は研究の参考として,そして自分が行った研究がどこかへ行ってしまわないように保存するため, gitサーバ上で管理しようと思いました.

依存

  • glm
  • freeglut
  • OpenGL
  • GLEW

設計**

「グローバル変数を可能な限りもたない」システムを目指しました.

当時はglfwが今ほど一般的になっていなかったため,glutを使っていましたが, どうしてもコールバック関数などはグローバルに参照した方が効率的でした.

このグローバルに参照するのはひじょうに美しくないだけでなくソースコードの可読性, 変数管理の面などでも支障をきたすため,これを可能な限り減少させることに努めました.

仕組みとしては,glutよりも上位の階層に 全体を管理するクラス を作成し, レンダリングを担当する基幹フレームワーク部分はすべてそのクラスの下でインスタンス変数として作成することを目指しています.

オブジェクト指向

また,オブジェクト指向プログラムを実現するため,基本的にすべての物体はそれを出力するためのクラスをもちます. これにより, 全体を管理するクラス に任意のクラスを定義するだけで,新たなオブジェクトが使用可能になるような仕組みにしています.

レンダリングパイプラインも同様に,クラス単位で管理されています. これを作成した当時は時間の都合上,完全なインスタンス化には至りませんでしたが, レンダリングの各段階については一つのクラスで管理しています.

例えば,ボリュメトリックシェーディングでは,

  • シャドウマップ
  • ボリュームマップ
  • レンダリング

の三段階があるわけですが,これに対応するそれぞれのクラスを呼び出すことで,簡単にレンダリングパイプラインを構築できるようになっています.

モダンOpenGLの使用

2013年時点では,リリースされたGLのバージョンこそある程度進んではいましたが, 世の中の資料の多くは1.2や2.1で書かれていました. 新しいものがリリースされているのに使わない,というのは情報系として気持ちが悪かったので, このプロジェクトではモダンOpenGLがもつデータの受け渡し法などを試験的に使用しています.

このように,学生だからこそこだわっている部分が少しずつ点在しているので,興味があればシェーダなどだけでも,覗いてみてもよいかもしれません.

バージョン問題

ただし,作成した時点からOpenGL周りの状況もかなり変わっているらしく, ハードウェア側が以前よりもメモリリークなどに厳しくなっているようです.

このため,以前は強制終了など起こしていなかったために見過ごされていたバグなどが発生しており, 数分でアボートしたりします.

この点は気を付けてください.

後悔している点

  • プロジェクト名:[OSM]loadHairModelという名称で作り始めてしまったが,Visual Studioのプロジェクトは後から名前を変えるのが大変なのでそのままになっている.