前回のテセレーションの試作において、OpenGLの関数にてワイヤフレームを描画していたのですが、動画公開時によくよく見てみると、あるタイミングでワイヤフレームとテセレーション結果が一致していないという妙な症状が出ていることがわかりました。
そこでワイヤフレームの描画について見直しをしてみようと思いました。OpenGL 4.0 Shading Language Cookbook という書籍にて、アンチエイリアスがかかったワイヤフレーム描画を行うサンプルがあったのでこれを導入してみました。サンプルではVS, GS, PS でしたが、ここではさらに TES, TCS も有効化して、シェーダーをフル動員してみました。
結果はこの動画のようになりました。フレームを見ていても妙なところはなく、それなりにアンチエイリアスされたワイヤフレームで描画が行われています。以前のワイヤフレームよりは、ギザギザ感がなくなりました。
拡大してみるとこんな感じになってます。それなりにアンチエイリアス処理っぽいものがされているため、普通に動かしているときにはなめらかに見えている感じです。拡大したこの図を見ている限りでは、ちょっと妙なところはあるかもしれません。
補足
詳しい実装方法は書籍の方を参考にして下さい。
ただ書籍の中であまり丁寧に書かれていなかった部分について、ここで触れておきたいと思います。
ビューポート行列というものが出てきます。これはビュー行列ではなくビューポート変換をするための行列を示しており、下記のようなコードで生成することができます。
GLint viewport[4] = { 0 }; glGetIntegerv( GL_VIEWPORT, viewport ); float halfWidth = viewport[2] * 0.5f; float halfHeight= viewport[3] * 0.5f; glm::mat4 matViewport( glm::vec4( halfWidth, 0.0f, 0.0f, 0.0f ), glm::vec4( 0.0f, halfHeight, 0.0f, 0.0f ), glm::vec4( 0.0f, 0.0f, 1.0f, 0.0f ), glm::vec4( halfWidth, halfHeight, 0.0f, 1.0f ) );
感想
ジオメトリシェーダーで辺と内部の判定を行うための変数(係数)を計算しています。あまりジオメトリシェーダーの活躍をみなかったのですが、地味なところで実は活躍できるそんなシェーダーなのではないかと思いました。ポイントスプライト以外にもちゃんと役立てられるということが印象深かったです。