在简单DirectX引擎中集成Oculus SDK

在简单DirectX引擎中集成Oculus SDK,directx,oculus,Directx,Oculus,我曾经在一个非常简单的DirectX11渲染引擎上工作过一段时间。今天,我成功地设置了两次立体渲染,将场景渲染为纹理,以实现Oculus Rift集成 [目前] 所以我现在基本上做的是: 我有一扇1280 x 800的窗户 将整个场景渲染到RenderTargetViewLeft_u1280x 800中 将RenderTargetViewLeft_uu的内容渲染为眼睛窗口,如教程中所示,显示在屏幕640 x 800的左侧 将整个场景渲染到RenderTargetViewRight_u1280x

我曾经在一个非常简单的DirectX11渲染引擎上工作过一段时间。今天,我成功地设置了两次立体渲染,将场景渲染为纹理,以实现Oculus Rift集成

[目前] 所以我现在基本上做的是:

我有一扇1280 x 800的窗户 将整个场景渲染到RenderTargetViewLeft_u1280x 800中 将RenderTargetViewLeft_uu的内容渲染为眼睛窗口,如教程中所示,显示在屏幕640 x 800的左侧 将整个场景渲染到RenderTargetViewRight_u1280x 800中 将RenderTargetViewRight_uu的内容渲染为与教程中类似的眼窗,并显示在屏幕640 x 800的右侧 到目前为止,所有这些工作都完成了,我将场景渲染两次到不同的纹理中,最终得到一个分割屏幕

[DirectX11渲染循环]

[我现在想做什么] 现在我正试图用Oculus SDK实现桶形失真。目前,我并不关心第二幅图像的不同虚拟相机,只想现在实现桶形失真

我已经阅读了《开发人员指南》[1],并尝试研究TinyRoom演示,但我不完全理解在我已经在工作的DirectX引擎中使用SDK实现失真需要什么

在“开发人员指南”“渲染纹理初始化”中,他们演示了如何为API创建纹理。我想这意味着,我需要使用相应的API大小设置所有RenderTargetView渲染目标当前的大小为1280 x 800-我想甚至还需要更改DepthStencilView和Backbuffer sice

渲染循环将如下所示:

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纹理大小造成的。在移动HMD时,CameraStream似乎也没有与屏幕正交。要做进一步的测试


[1] -Oculus开发者指南:

3d HMD支持的关键点通常是渲染整个图形场景两次。一次是用左边的虚拟摄像机,一次是用右边的虚拟摄像机——它们之间的视距不同,但大约是65毫米

要存储场景,必须将图形场景渲染为纹理。我首先使用左侧虚拟摄影机将场景渲染到RenderTextReleft\中,然后使用右侧虚拟摄影机将完全相同的场景渲染到RenderTextureRight\中。这种技术称为“渲染到纹理”。这意味着我们将图像保存到一个单独的纹理中,以便进行进一步的后处理,而不是直接渲染到backbuffer中以显示在监视器上

那么好吧,但是我们现在如何渲染Oculus裂谷呢?首先设置hmd实例并正确配置它很重要。这在官方文件[1]中得到了很好的解释:

在两个RenderTextures(左眼、右眼)成功渲染为纹理后,oculus设备已相应配置,需要向Oculus SDK提供两种渲染纹理,以便在hmd的显示器上打印它们,并使用Oculus SDK进行桶形失真,而不是新SDK版本不再支持的客户端失真

在这里,我展示了我的DirectX代码,该代码为oculus sdk提供了我的渲染纹理,还进行了桶变形:

bool OculusHMD::RenderDistortion()
{
    ovrD3D11Texture eyeTexture[2]; // Gather data for eye textures 
    Sizei size;
    size.w = RIFT_RESOLUTION_WIDTH; 
    size.h = RIFT_RESOLUTION_HEIGHT;

    ovrRecti eyeRenderViewport[2];
    eyeRenderViewport[0].Pos = Vector2i(0, 0);
    eyeRenderViewport[0].Size = size;
    eyeRenderViewport[1].Pos = Vector2i(0, 0);
    eyeRenderViewport[1].Size = size;

    eyeTexture[0].D3D11.Header.API = ovrRenderAPI_D3D11;
    eyeTexture[0].D3D11.Header.TextureSize = size;
    eyeTexture[0].D3D11.Header.RenderViewport = eyeRenderViewport[0];
    eyeTexture[0].D3D11.pTexture = graphicsAPI_->renderTextureLeft_->renderTargetTexture_;
    eyeTexture[0].D3D11.pSRView = graphicsAPI_->renderTextureLeft_->GetShaderResourceView();

    eyeTexture[1].D3D11.Header.API = ovrRenderAPI_D3D11;
    eyeTexture[1].D3D11.Header.TextureSize = size;
    eyeTexture[1].D3D11.Header.RenderViewport = eyeRenderViewport[1];
    eyeTexture[1].D3D11.pTexture = graphicsAPI_->renderTextureRight_->renderTargetTexture_;
    eyeTexture[1].D3D11.pSRView = graphicsAPI_->renderTextureRight_->GetShaderResourceView();

    ovrHmd_EndFrame(hmd_, eyeRenderPose_, &eyeTexture[0].Texture);

    return true;
}
立体图像的呈现,包括桶形失真作为一种后处理效果,最终通过以下行完成:

ovrHmd_EndFrame(hmd_, eyeRenderPose_, &eyeTexture[0].Texture);
希望代码能帮助一方或另一方更好地理解管道

ovrHmd_EndFrame(hmd_, eyeRenderPose_, &eyeTexture[0].Texture);