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. Есть ли способ добиться этого с двойной буферизацией?


person shoosh    schedule 18.10.2009    source источник


Ответы (1)


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

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

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

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

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

person Bahbar    schedule 18.10.2009