Встроенный плагин рендеринга с Oculus Rift

Я работаю над проектом, который переносит часть рендеринга в собственный плагин, который я написал для Unity, чтобы использовать создание экземпляров и другие расширенные графические функции. Я разрабатываю его для кроссплатформенного выпуска, но я работаю с Mac, поэтому тестирование проводится в основном с OpenGL. На данный момент плагин отображает только четырехугольник в центре экрана, окрашенный шестнадцатеричными значениями. Плагин работает, как и ожидалось, в пустом проекте Unity, но как только я включаю его в свой проект Oculus, он начинает вести себя хаотично.

В Rift геометрия плагина отрисовывается дважды, один раз растягивая оба глаза, а другой раз рисуя только в пределах правого глаза. Кроме того, любые примитивные цвета, которые я применяю к геометрии, теряются, и кажется, что геометрия подбирает окружающие цвета; на черном экране с красным текстом геометрия будет в основном черной с небольшими красными пятнами в линиях. Как только мой зеленый ландшафт загружается, геометрия, нарисованная плагином, становится зеленой.

Ниже приведен скриншот геометрии, отрисовываемой в пустом проекте Unity, в котором нет ничего другого:

Пустой проект Unity

А вот скриншот той же геометрии, рисуемой поверх моего приложения Oculus Rift:

Родной рендеринг поверх Oculus Rift

Вот создание вершин, которые я визуализирую (три координаты и цвет):

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!


person Jyakku    schedule 27.10.2014    source источник
comment
Почему голосование за близкое?   -  person datenwolf    schedule 27.10.2014
comment
Обратите внимание, что обычно перед рендерингом также необходимо установить область просмотра. OVR SDK явно предоставляет функцию для запроса целевого окна просмотра в цели рендеринга. В настоящее время я не на компьютере с доступом к моему хранилищу паролей с логином разработчика Oculus, поэтому я не могу ссылаться на ссылку   -  person datenwolf    schedule 27.10.2014
comment
Поскольку я работаю в Unity, в настоящее время я не внедряю SDK в свой написанный код; просто используя пакет интеграции Oculus и кодирование поверх него. На самом деле, я даже не уверен, можно ли получить доступ к свойствам OVR SDK из внешнего плагина C++ во время выполнения Unity. Я был бы готов добавить Oculus SDK в свой плагин в качестве зависимости, но это кажется немного избыточным, если оно вообще будет работать.   -  person Jyakku    schedule 27.10.2014
comment
Вы когда-нибудь заставляли это работать? У меня похожая проблема.   -  person 3Dave    schedule 14.09.2015
comment
Нет, мне так и не удалось обойти эту проблему, хотя я не пробовал запускать этот код со встроенной интеграцией виртуальной реальности Unity с тех пор, как он вышел. Я думаю, что было бы разумно попробовать добавить композитора в новый конвейер VR, поэтому я опубликую здесь, если это даст положительные результаты, когда я попробую.   -  person Jyakku    schedule 15.09.2015


Ответы (1)


Вы можете использовать систему пользовательского интерфейса Unity для рендеринга спрайтов в соответствии с вашими потребностями. Вот статья от Oculus, описывающая, как настроить систему пользовательского интерфейса Unity для виртуальной реальности: 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, как описано ниже.

person RCYR    schedule 12.02.2016