OpenGLとEffekseer連携
今回チームで作ってるゲームにEffekseerを導入したので、
それで得た知見を書いていこうと思います
・そもそもEffekseerとは?
エフェクトを作成できるツールで、作ったエフェクトをDirectXやOpenGL、DxLib、Unityに導入することが出来ます。
オープンソースなので中身がどうなってるか見ることも出来ます。
詳しいことは下記のURLを参照ください。
http://effekseer.github.io/jp/
ドキュメントも公開されています。
http://effekseer.github.io/jp/documentation.html
今回はOpenGLでやる前提で話を進めます。
・設定方法
ドキュメントにあるマニュアル通りにやりましたのでこれといった工夫はあんまりありません。
Effekseer側の投影行列とカメラ行列の更新で行列渡すときにEffekseer::Matrix44の型で渡さないといけなかったので、
変換用の関数用意してglmのmat4を渡して変換させてました。
//glm::mat4からEffekseer::Matrix44へ変換 Effekseer::Matrix44 glmToEffekseerMatrix(const glm::mat4& mat4) { Effekseer::Matrix44 mat; for (int x = 0; x < 4; x++) { for (int y = 0; y < 4; y++) { mat.Values[y][x] = mat4[y][x]; } } return mat; }
適用したソース
glm::mat4 projection; //プロジェクション行列を取得 glGetFloatv(GL_PROJECTION_MATRIX, (GLfloat*)&projection); //プロジェクション行列設定 Effekseer::Matrix44 matProjection = glmToEffekseerMatrix(projection); m_Renderer->SetProjectionMatrix(matProjection); glm::mat4 view; //カメラ行列を取得 glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat*)&view); //カメラ行列の設定 Effekseer::Matrix44 matView = glmToEffekseerMatrix(view); m_Renderer->SetCameraMatrix(matView);
・詰まった所
Effekseerのエフェクトを表示すると
シェーダーで表示したオブジェクトが消える問題が発生しました。
調べてみたらEffekseerManagerのBeginRenderingすると
Effekseer側の描画設定になるみたいで、
オブジェクト→Effekseerのエフェクトの順番で描画してたせいか
自分で設定した描画設定が上書きされちゃうみたいでした。
制作ではライティングを切っていたりしたりのでそれが原因かなと思い、
EndRendering実行前にglPushAttributeで自分が有効にした描画設定を退避させて、
描画終わりにglPopAttributeで元に戻すことで解決した!と思いきや、
今度は前後関係が消えてしまって、
手前にいるはずのオブジェクトが奥に表示される自体に…。
glGetBooleanでデプステストがどこで無効化されてるのか調べた所、
どうやらBeginRenderingするとDEPTH_TESTが無効化されるみたいで、
EndRendering終了後にglEnable(GL_DEPTH_TEST)を記述することにより解決しました。
//有効化してる物を退避 glPushAttrib(GL_ENABLE_BIT); m_Renderer->EndRendering(); //元に戻す glPopAttrib(); //デプステストが無効化されてるので有効化 glEnable(GL_DEPTH_TEST);
現時点で試した所はここまでなので今回は終わります。
OpenGLでの情報が全然なかったのでだいぶ苦労しましたが、
また何か新しいことが分かったらEffekseerについて書きたいと思います。