2014-03-30 41 views
3

我正在使用GLKit爲iPhone開發一個OpenGL項目,並且需要一次繪製幾個不同的對象並獨立旋轉和轉換它們。幾乎所有我見過的GLKit例子都將渲染類(通常是GLKViewController)中的頂點/顏色/紋理數據放在一起。 我需要做的是創建單獨的類來保存對象數據,並從GLKViewController類簡單地調用對象的繪製方法。喜歡的東西:GLKViewController:使用GLKit設置獨立對象

-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect{ 
    [mycube draw:view]; 
} 

-(void)glkViewControllerUpdate:(GLKViewController *)controller{ 
    [mycube updateposition:controller.timesincelastdraw]; 
} 

我應該如何去實現呢?我怎樣才能從一個單獨的類中繪製EAGLContext?有什麼我可以看看的例子嗎?謝謝。

回答

2

應繪製的每個對象都應該符合某個協議,該協議將提供所有必要的信息以供顯示。渲染代碼將包含在渲染器類中。例如:

@protocol Renderable <NSObject> 
// returns a vertex array 
-(GLfloat*)mesh; 

@optional 
-(GLKBaseEffect*)effect; 
@end 

@interface GLRenderer : NSObject 

@property(nonatomic, strong) EAGLContext* context; 

-(void)draw:(id<Renderable>)renderable; 

@end 

繪圖將在渲染器類中完成。所以你只需撥打

[myRenderer draw:myCube]; 

在情況(由於某種原因),你想打電話立方體本身抽籤的方法,我建議你保持渲染代碼渲染器內,簡單地處理,通過渲染通過爲每個對象創建一個基本可繪製對象來繼承。它會執行Renderable協議並實現所有必需的方法。

我建議你簡單地開始實施基本的繪圖操作,並根據需要進行擴展。嘗試將通用代碼放置在對象中的渲染器和特定於對象的代碼中,但通過Renderable協議提供。

-(void)draw:(id<Renderable>)renderable{ 
    if([renderable respondsToSelector:@selector(effect)]){ 
      [[renderable effect] prepareToDraw]; 
    } 
    GLFloat* data= [renderable mesh]; 
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), 
        data, GL_STATIC_DRAW); 
    // etc 
} 
+1

這是一個很好的方法。但值得指出的是,它只是衆多可行的應用架構之一。要快速總結另一個:在我的一些應用程序中,我遵循類似於GLKEffects類的模式,其中部分場景管理GL資源並執行GL命令,但假定調用代碼將管理上下文。例如一個'Cube'類在'init'中設置了一個VAO並將其繪製在一個'draw'方法中,但它並不關心'EAGLContext'或着色器/ GLKEffects,因爲它假設你將它們設置爲當前狀態在調用'init'或'draw'之前。 – rickster

+0

@rickster,這是我一直在做的方法。我正在設置當前上下文setCurrentContext:,然後在我要繪製的對象上調用draw方法,例如立方體。似乎對我來說正確的方法,感謝您的意見! – Stuartsoft