-setWantsLayer вызывает искажения в NSOpenGLView - PullRequest
3 голосов
/ 20 августа 2011

Это то, что я хочу сделать с моим NSOpenGLView. В настоящее время NSOpenGLView покрывает всю область окна, и я бы хотел добавить кнопки, nsviews и изображения поверх NSOpenGLView. Я просмотрел сеть и обнаружил, что [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 Ответ

2 голосов
/ 02 октября 2011

У меня была такая же проблема, но я решил ее, прочитав пример кода ReadMe. Вам необходимо реализовать -drawRect: в вашем подклассе NSOpenGLView. Без этого поддержка слоев не поддерживается.

Итак, внедрите -drawRect и сделайте там свой рисунок. Одна досадная вещь в том, что вам, вероятно, лучше отделить сцену от openglview. Вот что они сделали в примере кода.

...