你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> CardboardSDK-iOS 源碼復雜剖析

CardboardSDK-iOS 源碼復雜剖析

編輯:IOS開發綜合

該項目地址: 地址
克隆地址為 https://github.com/rsanchezsaez/CardboardSDK-IOS.git

目前假如想在IOS設備上完成雙目VR的功用,Google 曾經提供了官方的sdk,上手復雜,但是由於在實踐運用中有其他需求,GVR的源碼無法修正,所以還是運用這個野生的SDK來開發。這篇文章次要就是復雜剖析一下這個sdk的ViewController 的代碼,至於外部的復雜數學計算,暫時無法觸及。

CBDViewController

次要要剖析的就是 CBDViewController 這個類,其承繼了 GLKViewController 並完成樂 GLKViewControllerDelegate 這個接口。成員:stereoRendererDelegate 擔任完成若干個回調函數,比方在Cardboard各個設置完成後停止所需的繪制任務。

1. Init

初始化各個成員變量,設置GLKViewController的delegate為self,啟動設備的傳感器,開端監聽。

2. ViewDidLoad

創立OpenGL的Context 並回調 [self.stereoRendererDelegate setupRendererWithView:self.view] 此時設置Context為 glview.context,可以停止繪制的預備任務,比方創立program 上傳attribute,uniform的數據。

3. glkViewControllerUpdate:(GLKViewController *)controller

Called before each frame is displayed, 所以此處所做的事情次要是依據傳感器數據計算出繪制所需的參數,次要是變換矩陣,fov和viewport僅需求在更新視窗的時分更新。

調用 calculateFrameParametersWithHeadTransform... 函數,該函數次要功用:

  1. (VR形式下) 依據以後傳感器數據計算出各變換矩陣,存入leftEyerightEye對象中去。
  2. (非VR形式下)monocularEye 更新viewport
  3. (若需求時)更新左右眼的fov:updateFovsWithLeftEyeFov:leftEye->fov() rightEyeFov:rightEye->fov() 然後調用 _distortionRenderer->fovDidChange(...) 計算後果存儲在傳入的 leftEye rightEye 參數中。詳細內容為:
    • 1) updateFovsWithLeftEyeFov...:計算出上下左右四個方向的fov角
    • 2) fovDidChange(...): 依據fov值計算出兩個眼的viewport詳細數值。
  4. _distortionRenderer->updateViewports(leftEye->viewport(), rightEye->viewport())更新左右眼的viewport
4. glkView:(GLKView *)view draWinRect:(CGRect)rect

繪制的回調函數。

  1. _distortionRenderer->beforeDrawFrame()
    • (需求時) updateTextureAndDistortionMesh()
    • glBindFramebuffer
  2. drawFrameWithHeadTransform(...) 回調:

    [self.stereoRendererDelegate prepareNewFrameWithHeadViewMatrix:headTransform->headView()];
    // ...
    [self.stereoRendererDelegate drawEyeWithEye:_leftEyeWrapper];
    // ...
    [self.stereoRendererDelegate drawEyeWithEye:_rightEyeWrapper];
  3. Rebind original framebuffer
  4. _distortionRenderer->afterDrawFrame()---> undistortTexture(_textureID)
  5. finishFrameWithViewPort: callback: stereoRendererDelegate finishFrameWithViewportRect:

需求剖析闡明的如下

DistortionRenderer::updateTextureAndDistortionMesh() :

首先創立兩個program用於繪制畸變校正。這兩個program的區別在於紋理,無矯正只要一個紋理sampler,帶矯正的辨別有RGB三個紋理sampler. 然後計算畸變矯正所需參數然後創立 DistortionMesh 對象: 創立對象時生成所需的vertexData和indexData 並綁定到相應的array buffer下面去。 再之後創立紋理、renderbuffer和framebuffer.留意,這裡創立的紋理,其內容是空的,glTexImage2D(GL_TEXTURE_2D, 0, textureFormat, width, height, 0, textureFormat, textureType, nil);

undistortTexture(_textureID) :
做一OpenGL形態的備份:將一切的OpenGL形態相關信息通通保管上去。若需求時,依然是調用一遍 updateTextureAndDistortionMesh. 調用 renderDistortionMesh(_leftEyeDistortionMesh, textureID) 外部完成:目前已知vertexData indexData以及TextureId 將這些數據通通上傳至畸變矯正用的program上,並繪制。完成後將保管的gl信息通通設置回去。

復雜運用

剖析提供的例子可知,復雜運用時只需求承繼這個CBDViewController類,並完成幾個GLKViewController的辦法,設置好stereoRendererDelegate 即可。次要的任務就是stereoRendererDelegate完成的,回調函數一覽:

@protocol CBDStereoRendererDelegate <NSObject>

- (void)setupRendererWithView:(GLKView *)glView;
- (void)shutdownRendererWithView:(GLKView *)glView;
- (void)renderViewDidChangeSize:(CGSize)size;

- (void)prepareNewFrameWithHeadViewMatrix:(GLKMatrix4)headViewMatrix;
- (void)drawEyeWithEye:(CBDEye *)eye;
- (void)finishFrameWithViewportRect:(CGRect)viewPort;

@optional

- (void)triggerPressed;

@end



【CardboardSDK-iOS 源碼復雜剖析】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved