Конференция "Media" » Сглаживание при вызове метода blt поверхности DirectX в Висте [D7]
 
  • Дмитрий Белькевич © (12.04.08 15:46) [0]
    Вызываю IDirectDrawSurface.Blt для переноса изображения с некоторой экранной поверхности на первичную. При этом размеры области для переноса на первичной поверхности и изначальной поверхности чаще всего не совпадают.
    В Win XP и более старых включается хардварный стретч, и видюха сама качественно растягивает либо сжимает изображение. В Висте же для стретча применяется алгоритм 'ближайший сосед'. Стретч быстрый, но некачественный.

    Можно ли в Висте как-то включить качественный алгоритм сглаживания при изменении размера изображения?
  • Дмитрий Белькевич © (12.04.08 15:54) [1]
    Уточнения. IDirectDrawSurface.Blt ошибок не возвращает. DDCAPS_BLTSTRETCH драйвер умеет.
  • Sapersky (12.04.08 18:10) [2]
    Меня в своё время интересовал вопрос, как отключить сглаживание - так и не нашёл на него ответа. В конечном итоге перешёл на D3D7. Проблем с аппаратной поддержкой никаких - если карта умеет DDCAPS_BLTSTRETCH, то почти наверняка и D3D, и даже наоборот, некоторые (интегрированные на i810-815) могут выводить полигоны с текстурами, но не умеют масштабировать поверхности. Фильтрация легко включается/выключается.
    С т.з. сложности реализации, если размеры поверхностей у вас меньше обычного макс. размера текстуры (2048*2048) - тоже никаких проблем, можете посмотреть вот это:
    http://sapersky.narod.ru/files/D3D7_sprite_sample_04.rar
    Если больше (или вам нужна работоспособность на старичках вроде TNT с их макс. 512*512), картинку нужно "порезать" на тайлы соотв. размера.
  • Дмитрий Белькевич © (15.04.08 00:55) [3]
    Спасибо. Интересная идея. Жаль, ограничения размеров не всегда приемлемы.
    При разрезании на тайлы дырок между текстурами не получится? Или от карточек зависит?
  • Sapersky (15.04.08 18:29) [4]
    До сего момента пребывал в уверенности, что нет никаких дырок. Сейчас собрал пример:
    http://sapersky.narod.ru/files/D3D7_image_tiling.rar
    и обнаружил, что хоть и не "дырки", но стыки видны. Вряд ли виновата конретная карточка, скорее, причина - сам алгоритм билинейной фильтрации, не может он выбирать сэмплы из соседней текстуры, только из текущей.
    Однако данный пример - экстремальный случай, текстура специально режется на мелкие тайлы 16*16; на практике, если использовать реальный макс. размер текстуры - стыки почти (а если масштаб при выводе <= 1 - то и совсем) не видны.

    Кстати, у DDraw на некоторых картах (Радеоны, интеловские интегрированные) тоже имеются проблемы с масштабированием больших картинок. Работать работает, но начинаются немотивированные тормоза, такое ощущение, что драйвер частично переключается на софтвер. Видимо, DDraw-масштабирование в этих "железках" реализовано через наложение текстуры.
  • Дмитрий Белькевич © (15.04.08 21:35) [5]
    >До сего момента пребывал в уверенности, что нет никаких дырок

    Я просто по игрушкам помню - часто дырки были заметны.

    >Вряд ли виновата конретная карточка, скорее, причина - сам алгоритм билинейной фильтрации,

    Пример еще не забирал, но скорее всего - из-за фильтрации проблемы. Из-за того, что краевые пиксели не с чем сглаживать.

    >стыки почти (а если масштаб при выводе <= 1 - то и совсем) не видны.

    У нас область весьма специфическая - медицина. Могут быть вопросы. Даже из-за одного пикселя посередине изображения. Было бы на самом крае - еще туда-сюда, на краях данных практически никогда не бывает.
    Но вот в центре...

    >Работать работает, но начинаются немотивированные тормоза, такое ощущение, что драйвер частично переключается на софтвер.

    У нас были проблемы из-за того, что постоянно данные через агп шину приходилось гонять, а уже потом - масштабировать. Пришлось дописывать движок - делать дополнительный 'слой', что бы большие картинки предварительно софтверно до размера окна вывода масштабировались, а затем - отображались.

    Спасибо за участие в обсуждении, в любом случае...
  • Sapersky (16.04.08 20:32) [6]
    У нас область весьма специфическая - медицина. Могут быть вопросы. Даже из-за одного пикселя посередине изображения.

    В принципе, можно попробовать побороться со стыками, например, делать вокруг каждой текстуры бордюр из пикселей соседей, потом как-то подкручивать текстурные координаты, задействовать альфа-блендинг...
    Но более простым вариантом, наверное, будет использование в случае Висты софтверного масштабирования (FastLIB->FastSize.Bilinear, например), т.к. Виста автоматически подразумевает мощный компьютер, который с софтвером легко справится.
  • Дмитрий Белькевич © (16.04.08 22:43) [7]
    Sapersky, можно ли лично как-то связаться?
  • Дмитрий Белькевич © (17.04.08 00:01) [8]
    Нашел, отпишу - есть вопросы.
 
Конференция "Media" » Сглаживание при вызове метода blt поверхности DirectX в Висте [D7]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]