2011-02-14 114 views
2

在IB中,我在窗口中放置了一个NSOpenGLView实例。如何从视图控制器对象绘制到NSOpenGLView?

我有我所有的绘制代码自定义NSViewController里面,像这样:

// MyOpenGLViewController.h 

@interface MyOpenGLViewController : NSViewController 
{ 
    IBOutlet NSOpenGLView *glView; 
} 

// MyOpenGLViewController.m 

-(void)awakeFromNib 
{ 
    [self drawFrame]; 
} 

-(void)drawFrame 
{ 
    [[glView openGLContext] makeCurrentContext]; 
    glClearColor(0, 0, 0, 1); 
} 

一切都联系起来,“并条机”被调用,但我没有得到任何屏幕上。它总是白色的。我应该检查什么?

回答

4

通常一个子类NSOpenGLView并安装一个计时器来更新您的数据模型,如果有任何更改,然后绘制更改。控制器不应该进行绘图。苹果有一些很好的文档来帮助我们开展工作。从OpenGl Programming Guide for Mac OS X开始。

我似乎记得在Interface Builder中使用NSOpenGLView对象的一个​​错误。我总是做的是添加一个通用的NSObject,你想要视图并将其类设置为你的NSOpenGLView子类。

+0

好吧,这似乎是这样 - 我无法从控制器执行绘图。我发现了一些示例代码,尽管他们设置了它,所以我认为它应该起作用。但是,我无法在视图子类中初始化我的着色器。所以我在我的控制器中初始化它们,然后将“程序”传递给视图。似乎工作。谢谢。 – anna 2011-02-14 23:43:35

2

不确定可可,但glClearColor()只是设置一些状态。 glClear(GL_COLOR_BUFFER_BIT)实际上会清除帧缓冲区。

+0

良好的观察。虽然我确实在实际的代码中有这个。我只在这里张贴一行。还是行不通。没有任何绘图代码输出到屏幕上,我不知道在哪里看.. – anna 2011-02-14 22:39:27

1

晚了一点回答,但我想知道同样的事情,发现了这个线索,我想我应该有一些失位更新:P

至于其他提到的glClearColor(某人)只设置一个属性,实际清除必须用glClear完成(注意,除了颜色缓冲区之外,它还可以清除Z缓冲区,累加器模板)。

最后您的OpenGL命令需要实际刷新。这可以用glFlush(),如果你是单缓冲的,或者如果你是双缓冲的,则用glSwapAPPLE()来完成。

相关问题