インスタンス化やその他の高度なグラフィック機能を利用するために、Unity 用に作成したネイティブ プラグインに一部のレンダリングをオフロードするプロジェクトに取り組んでいます。クロスプラットフォーム リリース用に開発していますが、Mac で作業しているため、テストは主に OpenGL で行われます。この時点で、プラグインは 16 進値で色付けされた画面の中央にクワッドのみをレンダリングします。プラグインは、空の Unity プロジェクトでは期待どおりに動作しますが、Oculus プロジェクトに組み込むとすぐに、動作がおかしくなり始めます。
Rift では、プラグインのジオメトリは 2 回描画されます。1 回目は両目にストレッチし、もう 1 回目は右目の境界内のみに描画します。さらに、ジオメトリに適用したプリミティブ カラーはすべて失われ、ジオメトリは周囲の色を拾っているように見えます。黒い画面に赤いテキストが表示されている場合、ジオメトリはほとんどが黒く、線に赤が染み込んでいます。緑の地形が読み込まれるとすぐに、プラグインによって描画されたジオメトリが緑になります。
以下は、空の Unity プロジェクトに描画されているジオメトリのスクリーンショットです。他には何もありません。
そして、これは私の Oculus Rift アプリケーションの上に描画された同じジオメトリのスクリーンショットです:
これが私がレンダリングしている頂点の作成です(3つの座標と色):
Vertex verts[4] =
{
{ -0.5f, 0.5f, 0, 0xFF0000ff },
{ 0.5f, 0.5f, 0, 0xFFff0000 },
{ 0.5f, -0.5f, 0, 0xFF00ff00 },
{ -0.5f, -0.5f, 0, 0xFFff0000 },
};
プラグイン内のすべてのフレームで呼び出される描画関数は次のとおりです。
// OpenGL case
if (g_DeviceType == kGfxRendererOpenGL)
{
//initialize model view matrices
glMatrixMode (GL_MODELVIEW);
float modelMatrix[16] =
{
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1,
};
glLoadMatrixf (modelMatrix); //assign our matrix to the current MatrixMode
//initialize projection matrix
glMatrixMode (GL_PROJECTION);
projectionMatrix[10] = 2.0f; //tweak projection matrix to match D3D
projectionMatrix[14] = -1.0f;
glLoadMatrixf (projectionMatrix);
// Vertex layout
glVertexPointer (3, GL_FLOAT, sizeof(verts[0]), &verts[0].x);
glEnableClientState (GL_VERTEX_ARRAY);
glColorPointer (4, GL_UNSIGNED_BYTE, sizeof(verts[0]), &verts[0].color);
glEnableClientState (GL_COLOR_ARRAY);
glDrawArrays(GL_LINE_LOOP, 0, 4);
}
経験豊富なネイティブ プラグイン/Rift グラフィック コーダーからの洞察をいただければ幸いです。