9

インスタンス化やその他の高度なグラフィック機能を利用するために、Unity 用に作成したネイティブ プラグインに一部のレンダリングをオフロードするプロジェクトに取り組んでいます。クロスプラットフォーム リリース用に開発していますが、Mac で作業しているため、テストは主に OpenGL で行われます。この時点で、プラグインは 16 進値で色付けされた画面の中央にクワッドのみをレンダリングします。プラグインは、空の Unity プロジェクトでは期待どおりに動作しますが、Oculus プロジェクトに組み込むとすぐに、動作がおかしくなり始めます。

Rift では、プラグインのジオメトリは 2 回描画されます。1 回目は両目にストレッチし、もう 1 回目は右目の境界内のみに描画します。さらに、ジオメトリに適用したプリミティブ カラーはすべて失われ、ジオメトリは周囲の色を拾っているように見えます。黒い画面に赤いテキストが表示されている場合、ジオメトリはほとんどが黒く、線に赤が染み込んでいます。緑の地形が読み込まれるとすぐに、プラグインによって描画されたジオメトリが緑になります。

以下は、空の Unity プロジェクトに描画されているジオメトリのスクリーンショットです。他には何もありません。

空の Unity プロジェクト

そして、これは私の Oculus Rift アプリケーションの上に描画された同じジオメトリのスクリーンショットです:

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 グラフィック コーダーからの洞察をいただければ幸いです。

4

1 に答える 1

0

Unity UI システムを利用して、必要に応じてスプライトをレンダリングできます。Unity UI システムを VR 用に微調整する方法を説明している Oculus の記事は次のとおりです: https://developer.oculus.com/blog/unitys-ui-system-in-vr/

Unity 以外では、クアッド レイヤーを使用して目の FOV の上にレンダリングします。Oculus Rift のドキュメントで説明されているレイヤーは次のとおりです: https://developer.oculus.com/documentation/pcsdk/latest/concepts/dg-render/#dg_render_layers

クワッドレイヤー:

仮想世界で特定のポーズとサイズで長方形として表示されるモノスコピック イメージ。これは、ヘッドアップ ディスプレイ、テキスト情報、オブジェクト ラベルなどに役立ちます。デフォルトでは、ポーズはユーザーの実世界の空間を基準にして指定され、クワッドはユーザーの頭や体の動きに合わせて移動するのではなく、空間に固定されたままになります。ヘッドロックされたクワッドの場合、以下で説明するように ovrLayerFlag_HeadLocked フラグを使用します。

于 2016-02-12T03:52:33.687 に答える