在這裡將為大家引見的是CardboardSDK的相關引見,詳細實例請看下文
該項目地址: 地址
克隆地址為 https://github.com/rsanchezsaez/CardboardSDK-IOS.git
目前假如想在IOS設備上完成雙目VR的功用,Google 曾經提供了官方的sdk,上手復雜,但是由於在實踐運用中有其他需求,GVR的源碼無法修正,所以還是運用這個野生的SDK來開發。這篇文章次要就是復雜剖析一下這個sdk的ViewController 的代碼,至於外部的復雜數學計算,暫時無法觸及。
CBDViewController次要要剖析的就是 CBDViewController
這個類,其承繼了 GLKViewController
並完成樂 GLKViewControllerDelegate
這個接口。成員:stereoRendererDelegate
擔任完成若干個回調函數,比方在Cardboard各個設置完成後停止所需的繪制任務。
初始化各個成員變量,設置GLKViewController的delegate為self,啟動設備的傳感器,開端監聽。
2. ViewDidLoad創立OpenGL的Context 並回調 [self.stereoRendererDelegate setupRendererWithView:self.view]
此時設置Context為 glview.context
,可以停止繪制的預備任務,比方創立program 上傳attribute,uniform的數據。
Called before each frame is displayed, 所以此處所做的事情次要是依據傳感器數據計算出繪制所需的參數,次要是變換矩陣,fov和viewport僅需求在更新視窗的時分更新。
調用 calculateFrameParametersWithHeadTransform...
函數,該函數次要功用:
leftEye
和rightEye
對象中去。
(非VR形式下)monocularEye
更新viewport
(若需求時)更新左右眼的fov:updateFovsWithLeftEyeFov:leftEye->fov() rightEyeFov:rightEye->fov()
然後調用 _distortionRenderer->fovDidChange(...)
計算後果存儲在傳入的 leftEye
rightEye
參數中。詳細內容為:
1) updateFovsWithLeftEyeFov...
:計算出上下左右四個方向的fov角
2) fovDidChange(...)
: 依據fov值計算出兩個眼的viewport詳細數值。
_distortionRenderer->updateViewports(leftEye->viewport(), rightEye->viewport())
更新左右眼的viewport
4. glkView:(GLKView *)view draWinRect:(CGRect)rect
繪制的回調函數。
_distortionRenderer->beforeDrawFrame()
(需求時) updateTextureAndDistortionMesh()
glBindFramebuffer
drawFrameWithHeadTransform(...)
回調:
[self.stereoRendererDelegate prepareNewFrameWithHeadViewMatrix:headTransform->headView()];
// ...
[self.stereoRendererDelegate drawEyeWithEye:_leftEyeWrapper];
// ...
[self.stereoRendererDelegate drawEyeWithEye:_rightEyeWrapper];
Rebind original framebuffer
_distortionRenderer->afterDrawFrame()
---> undistortTexture(_textureID)
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
經過本文的學習希望對您理解和學習IOS開發的相關知識有一些好的協助.感激關注本站.我們將為您搜集更多更好的ios開發教程.
【CardboardSDK】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!