ВГЛ:Нет двойной буферизации + множественная выборка = FAIL?

StackOverflow https://stackoverflow.com/questions/1583611

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top