Некоторое время я работал над очень простым движком рендеринга DirectX11. Сегодня мне удалось настроить стереорендеринг (двойной рендеринг сцены в текстуры) для интеграции с Oculus Rift.
[В настоящее время] В настоящее время я в основном занимаюсь следующим:
- У меня окно 1280х800
- визуализировать всю сцену в RenderTargetViewLeft_ (1280 x 800)
- отображать содержимое RenderTargetViewLeft_ как «EyeWindow» (как в учебнике) в левой части экрана (640 x 800)
- визуализировать всю сцену в RenderTargetViewRight_ (1280 x 800)
- отображать содержимое RenderTargetViewRight_ как «EyeWindow» (как в учебнике) в правой части экрана (640 x 800)
так что все это работает до сих пор, я получил сцену дважды, отрендеренную в отдельные текстуры, в конечном итоге на разделенном экране.
[Цикл рендеринга DirectX11]
bool GraphicsAPI::Render()
{
bool result;
// [Left Eye] The first pass of our render is to a texture now.
result = RenderToTexture(renderTextureLeft_);
if (!result)
{
return false;
}
// Clear the buffers to begin the scene.
BeginScene(0.0f, 0.0f, 0.0f, 1.0f);
// Turn off the Z buffer to begin all 2D rendering.
TurnZBufferOff();
// Render The Eye Window orthogonal to the screen
RenderEyeWindow(eyeWindowLeft_, renderTextureLeft_);
// Turn the Z buffer back on now that all 2D rendering has completed.
TurnZBufferOn();
// [Right Eye] ------------------------------------
result = RenderToTexture(renderTextureRight_);
if (!result)
{
return false;
}
TurnZBufferOff();
RenderEyeWindow(eyeWindowRight_, renderTextureRight_);
TurnZBufferOn();
// [End] Present the rendered scene to the screen.
EndScene(); // calls Present
return true;
}
[Что я хочу сделать сейчас] Теперь я пытаюсь добиться бочкообразного искажения с помощью Oculus SDK. В настоящее время я не беспокоюсь о другой виртуальной камере для второго изображения, просто сейчас хочу добиться бочкообразного искажения.
Я прочитал руководство для разработчиков [1], а также попытался заглянуть в демонстрацию TinyRoom, но я не совсем понимаю, что сейчас необходимо для достижения искажения с помощью SDK в моем уже работающем движке DirectX.
В Руководстве для разработчиков Инициализация текстуры рендеринга показано, как создать текстуру для API. Я предполагаю, что это означает, что мне нужно настроить ВСЕ мои RendertargetViews с соответствующим размером API (Render Targets в настоящее время имеет размер 1280 x 800) - и даже изменить размер DepthStencilView и Backbuffer, я думаю.
Тогда цикл рендеринга будет выглядеть примерно так:
ovrHmd_BeginFrame(hmd, 0);
BeginScene(0.0f, 0.0f, 0.0f, 1.0f);
...
// Render Loop as the Code above
...
ovrHmd_EndFrame(hmd, headPose, EyeTextures);
// EndScene(); // calls Present, not needed on Oculus Rendering
Я чувствую, что чего-то не хватает, поэтому я уверен, что не все понял правильно.
[Обновление] Итак, мне удалось визуализировать сцену с бочкообразным искажением с помощью Oculus API. Хотя полигоны левого и правого изображения слишком далеко друг от друга, это может быть вызвано использованием моего размера текстуры по умолчанию 1280 x 800 для целей рендеринга. CameraStream также не отображается ортогонально экрану при перемещении HMD. Буду дальше тестировать ;)
[1] – Руководство для разработчиков Oculus: https://developer.oculus.com/documentation/