Возможно ли, чтобы в контексте opengl с двойным буфером передний и задний буферы были одинаковыми?

#objective-c #cocoa #macos #opengl #nsview

#objective-c #cocoa #macos #opengl #nsview

Вопрос:

У меня ситуация, в которой я запрашиваю и получаю контекст OpenGL с двойной буферизацией, но когда я рисую в нем, затрагиваются как передний, так и задний буфер. Буфер рисования устанавливается на задний буфер (и только на задний буфер). Если я посмотрю в OpenGL Profiler, я действительно увижу все это: значение для GL_DRAW_BUFFER (GL_BACK) и фактические задний и передний буфера, в которые рисуются.

Поскольку я работаю с NSWindow, у которого есть резервное хранилище, мы не видим, чтобы что-либо из этого происходило на экране. Проблема в том, что я получаю скриншоты этого окна с CGWindowListCreateImage. Похоже, что эта функция извлекает изображение из переднего буфера, а не из экранного буфера (где бы это ни находилось …). Таким образом, возвращаемое изображение является неполным: оно содержит только элементы, которые отрисовываются в момент его захвата, даже если очистка не вызывалась.

В пакете разработчика Mac есть утилита под названием Pixie. По сути, он захватывает экран в положении мыши и отображает его в увеличенном виде, чтобы вы могли его проанализировать. Эта программа ведет себя так же, как вызов CGWindowListCreateImage: вы можете видеть неполные изображения. Итак, я предполагаю, что проблема не в том, как я использую CGWindowListCreateImage, а скорее в моем окне или моем дисплее…

Кроме того, похоже, это происходит не всегда. Не все окна демонстрируют такое поведение, и даже для данного окна кажется, что оно появляется и исчезает, особенно если я перемещаю окно на другой экран (при двойном отображении).

Кто-нибудь сталкивался с этим раньше?

Комментарии:

1. Не могли ли вы где-то непреднамеренно поменять местами буферы?

2. Я устанавливаю точку останова до и после вызова glDrawArrays, и эффект наступает незамедлительно. Это было одно из моих первых предположений.

3. macOS X Cocoa / Quartz Extreme — это, по сути, композитная система управления окнами. Управление составными окнами в некотором роде устраняет необходимость в двойной буферизации для каждого окна, поскольку все, что рисуется в окне, проходит вторую стадию рисования (компоновка). Теперь я дико предполагаю: очень может быть, что в macOS X окно с двойной буферизацией на самом деле просто получает один буфер и подкачку с двойной буферизацией, используемую для синхронизации с compositor.

4. datenwolf: Я не думаю, что это так, потому что обычно я не вижу такого поведения.