2015-03-31 31 views
0

我在一個非常簡單的DirectX11渲染引擎上工作了一段時間。今天,我設法爲我的Oculus Rift集成安裝立體渲染(將場景渲染成紋理)。在簡單的DirectX引擎中集成Oculus SDK Distortion

[當前] 那麼我基本上做的是目前:

  • 我有一個1280 x 800的窗口
  • 渲染整個場景到RenderTargetViewLeft_(1280×800)
  • 將RenderTargetViewLeft_的內容渲染爲屏幕左側的「EyeWindow」(如教程中所示)(640 x 800)渲染整個場景到RenderTargetViewRight_(1280 x 800)
  • 渲染RenderTargetViewRight_的內容爲「EyeWindow」(像教程)的屏幕(640×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; 
} 

[我想現在要做] 現在我想實現一個桶形畸變與魔環SDK。目前,我並不關心第二張圖片的不同虛擬相機,只是想現在就實現桶形失真。

我已閱讀開發人員指南[1],並試圖研究TinyRoom演示,但我完全不明白現在需要使用已在使用的DirectX引擎中的SDK實現失真。

開發人員指南渲染紋理初始化,它們顯示瞭如何爲API創建紋理。我想這意味着,我需要設置所有我的RendertargetViews與相應的API大小(渲染目標目前大小爲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公司開發指南:https://developer.oculus.com/documentation/

回答

0

一個3D HMD支持的關鍵點一般是以使整個圖形場景的兩倍。一旦使用左側虛擬相機,並使用正確的虛擬相機一次 - 它們之間的「眼睛」距離會有所不同,但大約爲65毫米。

要存儲場景,必須將圖形場景渲染爲紋理。我已經將我的場景首先使用我的左側虛擬相機渲染到RenderTextureLeft_中,之後我將與我的右側虛擬相機完全相同的場景渲染到RenderTextureRight_中。這種技術被稱爲「渲染到紋理」。這意味着我們將圖像保存到一個單獨的紋理中,而不是將其直接渲染到後臺緩衝區以顯示在監視器上。

這麼好,但我們現在如何渲染到Oculus Rift?設置hmd實例並首先正確配置它非常重要。這在官方文檔[1]中有很好的解釋:https://developer.oculus.com/documentation/pcsdk/latest/concepts/dg-render/

在將RenderTextures(左眼,右眼)成功渲染爲紋理並且相應地配置了眼睛設備之後,需要提供Oculus SDK使用兩種渲染紋理將它們打印在hmd的監視器上,並使用Oculus SDK進行桶形失真(而不是在較新的SDK版本中不再支持的客戶端失真)。

我在這裏展示與我的兩個renderetextures的supplys魔環SDK我的DirectX代碼,同時也做了桶形失真:

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); 

希望代碼可以幫助其他人瞭解P ipeline更好。