2009-10-18 3 views
3

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

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 FPS (этот ЖК-дисплей для ноутбука работает на частоте 60 Гц). Но с двойной буферизацией я могу получить до 1500 FPS. Есть ли способ достичь этого с двойной буферизацией?

ответ

7

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

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

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

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

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

Смежные вопросы