Растягивание бликов в DirectX приводит к неровным краям

У меня есть приложение Direct3D, которое работает в оконном или полноэкранном режиме с фиксированным разрешением (скажем, 800x600). Для поддержки широкоэкранных режимов я выполняю рендеринг в задний буфер с разрешением 800x600, а затем использую Blt для отрисовки финального кадра в часть переднего буфера, которая обычно больше (скажем, 1280x720), поэтому изображение 800x600 растягивается до 960x720, чтобы сохранить соотношение сторон.

Это работает нормально, за исключением некоторых комбинаций видеокарты/ОС/драйвера (nVidia Quadro, DX11, Windows 7), где блит выполняется с использованием точечной выборки, что приводит к зубчатым краям и в целом негладкому конечному изображению.

Есть ли способ избежать этого? Например, заставить Blt использовать линейный фильтр при масштабировании?

(Примечание: я знаю, что могу преобразовать исходные ресурсы 800x600 в 960x720 вместо растягивания в конце, но у этого есть другие недостатки, поэтому предпочтительным решением является растяжение в конце)


person ggambett    schedule 21.12.2009    source источник
comment
Я хотел бы знать, каковы эти недостатки, потому что я убежден, что вам лучше сделать это правильно, чем делать взлом, как описано выше. По крайней мере, все ваши 3D-рендеринги будут выглядеть правильно, если вы сделаете это правильно...   -  person Goz    schedule 15.01.2010


Ответы (2)


Я не думаю, что есть какой-то способ контролировать это. Я читал что-то, говорящее, что это поведение изменилось в Windows7 с некоторыми драйверами, но сейчас я не могу найти ссылку.

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

person jcoder    schedule 23.12.2009

Рассматривали ли вы рендеринг сцены в текстуру, а затем рендеринг этой текстуры в растянутый задний буфер? Это даст вам билерпинг.

Причина, по которой это работает на некоторых машинах, заключается в том, что именно так блит будет реализован драйвером.

Тем не менее, чтобы получить наилучшие результаты, вам НА САМОМ ДЕЛЕ лучше не выполнять рендеринг в резервный буфер надлежащего размера. т.е. если вы хотите 1280x720... визуализировать в задний буфер 1280x720 с соответствующими модификациями поля зрения и соотношения сторон.

person Goz    schedule 15.01.2010
comment
Да, пару дней назад я сделал рендеринг в текстуру, и все работает нормально. Я выполняю рендеринг до целевого размера 800x600, а затем растягиваю окончательный четырехугольник — рендеринг непосредственно в буфер окончательного размера имеет другие проблемы, как я прокомментировал в своем исходном посте. - person ggambett; 15.01.2010