-
Вызываю IDirectDrawSurface.Blt для переноса изображения с некоторой экранной поверхности на первичную. При этом размеры области для переноса на первичной поверхности и изначальной поверхности чаще всего не совпадают. В Win XP и более старых включается хардварный стретч, и видюха сама качественно растягивает либо сжимает изображение. В Висте же для стретча применяется алгоритм 'ближайший сосед'. Стретч быстрый, но некачественный.
Можно ли в Висте как-то включить качественный алгоритм сглаживания при изменении размера изображения?
-
Уточнения. IDirectDrawSurface.Blt ошибок не возвращает. DDCAPS_BLTSTRETCH драйвер умеет.
-
Меня в своё время интересовал вопрос, как отключить сглаживание - так и не нашёл на него ответа. В конечном итоге перешёл на D3D7. Проблем с аппаратной поддержкой никаких - если карта умеет DDCAPS_BLTSTRETCH, то почти наверняка и D3D, и даже наоборот, некоторые (интегрированные на i810-815) могут выводить полигоны с текстурами, но не умеют масштабировать поверхности. Фильтрация легко включается/выключается. С т.з. сложности реализации, если размеры поверхностей у вас меньше обычного макс. размера текстуры (2048*2048) - тоже никаких проблем, можете посмотреть вот это: http://sapersky.narod.ru/files/D3D7_sprite_sample_04.rarЕсли больше (или вам нужна работоспособность на старичках вроде TNT с их макс. 512*512), картинку нужно "порезать" на тайлы соотв. размера.
-
Спасибо. Интересная идея. Жаль, ограничения размеров не всегда приемлемы. При разрезании на тайлы дырок между текстурами не получится? Или от карточек зависит?
-
До сего момента пребывал в уверенности, что нет никаких дырок. Сейчас собрал пример: http://sapersky.narod.ru/files/D3D7_image_tiling.rarи обнаружил, что хоть и не "дырки", но стыки видны. Вряд ли виновата конретная карточка, скорее, причина - сам алгоритм билинейной фильтрации, не может он выбирать сэмплы из соседней текстуры, только из текущей. Однако данный пример - экстремальный случай, текстура специально режется на мелкие тайлы 16*16; на практике, если использовать реальный макс. размер текстуры - стыки почти (а если масштаб при выводе <= 1 - то и совсем) не видны. Кстати, у DDraw на некоторых картах (Радеоны, интеловские интегрированные) тоже имеются проблемы с масштабированием больших картинок. Работать работает, но начинаются немотивированные тормоза, такое ощущение, что драйвер частично переключается на софтвер. Видимо, DDraw-масштабирование в этих "железках" реализовано через наложение текстуры.
-
>До сего момента пребывал в уверенности, что нет никаких дырок
Я просто по игрушкам помню - часто дырки были заметны.
>Вряд ли виновата конретная карточка, скорее, причина - сам алгоритм билинейной фильтрации,
Пример еще не забирал, но скорее всего - из-за фильтрации проблемы. Из-за того, что краевые пиксели не с чем сглаживать.
>стыки почти (а если масштаб при выводе <= 1 - то и совсем) не видны.
У нас область весьма специфическая - медицина. Могут быть вопросы. Даже из-за одного пикселя посередине изображения. Было бы на самом крае - еще туда-сюда, на краях данных практически никогда не бывает. Но вот в центре...
>Работать работает, но начинаются немотивированные тормоза, такое ощущение, что драйвер частично переключается на софтвер.
У нас были проблемы из-за того, что постоянно данные через агп шину приходилось гонять, а уже потом - масштабировать. Пришлось дописывать движок - делать дополнительный 'слой', что бы большие картинки предварительно софтверно до размера окна вывода масштабировались, а затем - отображались.
Спасибо за участие в обсуждении, в любом случае...
-
У нас область весьма специфическая - медицина. Могут быть вопросы. Даже из-за одного пикселя посередине изображения.
В принципе, можно попробовать побороться со стыками, например, делать вокруг каждой текстуры бордюр из пикселей соседей, потом как-то подкручивать текстурные координаты, задействовать альфа-блендинг... Но более простым вариантом, наверное, будет использование в случае Висты софтверного масштабирования (FastLIB->FastSize.Bilinear, например), т.к. Виста автоматически подразумевает мощный компьютер, который с софтвером легко справится.
-
Sapersky, можно ли лично как-то связаться?
-
Нашел, отпишу - есть вопросы.
|