Cocoa 如何从视图控制器对象绘制到NSOpenGLView?

Cocoa 如何从视图控制器对象绘制到NSOpenGLView?,cocoa,opengl,nsopenglview,Cocoa,Opengl,Nsopenglview,在IB中,我在窗口中放置了一个NSOpenGLView实例 我的所有绘图代码都在自定义NSViewController中,如下所示: // MyOpenGLViewController.h @interface MyOpenGLViewController : NSViewController { IBOutlet NSOpenGLView *glView; } // MyOpenGLViewController.m -(void)awakeFromNib { [se

在IB中,我在窗口中放置了一个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);
}

所有的东西都被连接起来了,“drawFrame”也被调用了,但我在屏幕上什么都没有看到。它总是白色的。我应该检查什么?

不确定可可豆,但
glClearColor()
只是设置了一些状态。将实际清除帧缓冲区。

通常会将NSOpenGLView子类化并安装计时器来更新数据模型,如果有任何更改,则绘制更改。控制器不应该进行绘图。苹果有一些很好的文档说明如何让某些东西工作。先从这个开始


我似乎还记得在Interface Builder中使用NSOpenGLView对象时出现的一个错误。我总是在想要视图的地方添加一个通用NSObject,并将其类设置为您的NSOpenGLView子类。

回答得有点晚,但当我想知道同样的事情并发现这个线程时,我想我应该用一些缺失的位来更新它:p

正如其他人提到的glClearColor()只设置了一个属性,实际的清除必须使用glClear完成(注意,除了颜色缓冲区外,它还可以清除Z缓冲区、累加器和模具)


最后,需要实际刷新OpenGL命令流。如果是单缓冲,则可以使用glFlush(),如果是双缓冲,则可以使用glSwapAPPLE()。

观察效果良好。尽管我在实际代码中有这样的代码。我在这里只发了一行。仍然不起作用。没有一个绘图代码被输出到屏幕上,我也不知道该去哪里看..好的,看起来是这样的-我不能从控制器上绘图。我发现了一些示例代码,他们是这样设置的,所以我认为它应该可以工作。但是,我无法在视图子类中初始化着色器。因此,我在控制器中初始化它们,然后将“程序”传递给视图。看起来很有效。谢谢。从控制器中绘图应该是可行的,也许还有其他的事情发生,但它打破了MVC范式。此外,初始化着色器应该在视图子类中工作。几年前我在OpenGL上了一门课,所有的平台代码都是从OpenGL代码中分离出来的。所有OpenGL代码都是带有全局状态的老式C。C代码是通过Objective-C层调用的,控制器只会在消息存在时调用Objective C。生成的OpenGL代码应该是跨平台的,尽管我从未尝试过。不幸的是,我无法发布该类的任何代码。