GLKViewController:使用GLKit设置独立对象

3
我正在使用GLKit为iPhone开发一个OpenGL项目,需要同时绘制多个不同的对象并且可以独立旋转和平移它们。我看过的几乎所有GLKit示例都将顶点/颜色/纹理数据放在渲染类中(通常是GLKViewController)。 我的需求是创建单独的类来保存对象数据,并从GLKViewController类简单地调用一个对象的绘制方法,例如:
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect{
    [mycube draw:view];
}

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

我该如何实现这个功能?我如何在另一个类中绘制到EAGLContext?有没有示例可以参考?谢谢。

1个回答

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命令,但假定调用代码将管理上下文。例如,一个“立方体”类在“init”中设置VAO,并在“draw”方法中绘制它,但它不关心EAGLContext或着色器/GLKEffects,因为它假定您会在调用“init”或“draw”之前设置它们并使它们成为当前的。 - rickster
@rickster,这是我一直在使用的方法。我正在设置当前上下文setCurrentContext:<context>,然后调用我想要绘制的对象(例如Cube)的draw方法。对我来说似乎是正确的方法,感谢您的建议! - Stuartsoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接