3

我正在使用 GLKit for iPhone 开发一个 OpenGL 项目,需要一次绘制几个不同的对象并独立旋转和翻译它们。我见过的几乎每个 GLKit 示例都将顶点/颜色/纹理数据放在渲染类(通常是 GLKViewController)中。我需要做的是创建单独的类来保存对象数据,并简单地从 GLKViewController 类调用对象的绘制方法。就像是:

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

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

我应该如何实施呢?如何从单独的类中绘制到 EAGLContext?有没有我可以看的例子?谢谢。

4

1 回答 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];

如果(出于某种原因),您想在立方体本身上调用 draw 方法,我建议您将渲染代码保留在渲染器中,并通过为每个对象创建一个基本可绘制对象来简单地通过继承处理渲染。它将实现 Renderable 协议并实现所有必需的方法。

我建议您从实现基本绘图操作开始,并在需要时进行扩展。尝试将通用代码放在 Renderer 中,将特定于对象的代码放在对象中,但通过 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
}
于 2014-04-10T20:10:35.473 回答