-setWantsLayer导致NSOpenGLView失真

时间:2011-08-20 17:06:20

标签: cocoa nsview subview nsopenglview

这就是我想用NSOpenGLView做的事情。目前,NSOpenGLView涵盖了窗口的整个区域,我想在NSOpenGLView上添加按钮,nsviews和图像。我浏览了网页,发现[myOpenGLView setWantsLayer:YES];允许我执行[myOpenGLView addSubView:someView]之类的操作。

这就是我得到的结果:

enter image description here

(有点不好的例子,因为我正在观看Family Guy,但证明了视频内存缓冲区在这里被截获的事实)

正如您所看到的那样,它会将一些视频内存缓冲区扭曲到窗口上。现在我正在做一些调试,问题在于-setWantsLayer。一旦我在代码中注释掉该行,所有OpenGL内容都会正确显示。

这就是我应该得到的:

enter image description here

所以我的问题是,如何才能正确显示我的OpenGL视图,同时-addSubViews

Apple有一个非常好的示例项目叫做“LayerBackedOpenGLView”(http://developer.apple.com/library/mac/#samplecode/LayerBackedOpenGLView/Introduction/Intro.html),我现在已经看了很长时间了,我不知道我在做什么不同它。我注意到的一件事是,不使用NSOpenGLView,Apple使用NSView并将类更改为NSOpenGLView子类的自定义类,而我使用NSOpenGLView并将类更改为再次子类化NSOpenGLView的自定义类。不确定这是否会导致任何问题,但如果我将其更改为NSView,我仍会遇到同样的问题。

1 个答案:

答案 0 :(得分:2)

我自己也有同样的问题,但是通过阅读示例代码ReadMe解决了这个问题。您需要在NSOpenGLView子类中实现-drawRect:。没有它,不支持图层背衬。

所以,实现-drawRect并在那里进行绘制。令人讨厌的是,你可能最好将场景与openglview分开。这就是他们在示例代码中所做的。