WGL: нет двойной буферизации + мультисэмплинг = FAIL?

Я обычно создаю пиксельный формат, используя wglChoosePixelFormatARB() с этими аргументами (среди прочих):

WGL_DOUBLE_BUFFER_ARB = GL_TRUE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 4

т.е. двойная буферизация и мультисэмплинг x4. Это работает просто отлично.
Но когда я пытаюсь включить двойную буферизацию:

WGL_DOUBLE_BUFFER_ARB = GL_FALSE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 4

Призыв к wglChoosePixelFormatARB() терпит неудачу (или скорее указывает, что это ничего не создавало)
Когда я эффективно отключаю мультисэмплинг:

WGL_DOUBLE_BUFFER_ARB = GL_FALSE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 1

Я снова отлично работаю.

Есть ли что-то, что мешает пиксельному формату с двойной буферизацией работать с мультисэмплингом?

Причина, по которой я отключаю двойную буферизацию, заключается в достижении неограниченной частоты кадров. с двойной буферизацией частота кадров, которую я получаю, составляет всего до 60 кадров в секунду (этот ноутбук работает на частоте 60 Гц). Но с двойной буферизацией я могу получить до 1500 FPS. Есть ли способ добиться этого с двойной буферизацией?

1 ответ

Решение

Теоретически, рисование в режиме одного буфера означает, что вы непосредственно модифицируете то, что отображается на экране (он же фронтальный буфер). Поскольку эта память уже находится в определенном формате, вы не можете выбрать другой. (Я говорю теоретически, потому что платформа делает это, однако, это нравится на практике. Aero, например, не разрешает доступ к переднему буферу).

Более того, при выполнении мультисэмплирования шаг, который преобразует X выборок / пиксель в 1 пиксель для рисования, - это когда задний буфер копируется в передний буфер (так называемый шаг разрешения). В режиме одного буфера такого шага нет.

Что касается блокировки 60 кадров в секунду, вы можете посмотреть на WGL_EXT_swap_control, Проблема здесь в том, что вы обычно не хотите обновлять то, что отображается на экране, пока на экране обновляются данные; это создает разрыв. Таким образом, по умолчанию Swap обновляется только во время вертикальной синхронизации экрана (он же vsync), поэтому вы в конечном итоге привязываетесь к частоте обновления экрана.

Если вы не возражаете против вашего дисплея, показывающего части различных кадров, вы можете отключить его.

Для полноты, есть альтернативный режим, называемый тройной буферизацией, который по существу имеет рендеринг пинг-понга графического процессора между двумя буферами, в то время как передний буфер показан. Это зависит от gpu, чтобы выбрать последний готовый резервный буфер, когда придет время изменить то, что отображается на экране (vsync). К сожалению, мне неизвестен метод WGL для запроса тройной буферизации.

Другие вопросы по тегам