Cocoa 如何从视图控制器对象绘制到NSOpenGLView?
在IB中,我在窗口中放置了一个NSOpenGLView实例 我的所有绘图代码都在自定义NSViewController中,如下所示:Cocoa 如何从视图控制器对象绘制到NSOpenGLView?,cocoa,opengl,nsopenglview,Cocoa,Opengl,Nsopenglview,在IB中,我在窗口中放置了一个NSOpenGLView实例 我的所有绘图代码都在自定义NSViewController中,如下所示: // MyOpenGLViewController.h @interface MyOpenGLViewController : NSViewController { IBOutlet NSOpenGLView *glView; } // MyOpenGLViewController.m -(void)awakeFromNib { [se
// 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代码应该是跨平台的,尽管我从未尝试过。不幸的是,我无法发布该类的任何代码。