Я хочу скалировать изоброжение на GPU с помощю шейдера(DirectX, HLSL 4.0) и для этого использую Filters: linear, trilinear , anisotropic.
в шейдере у меня есть три SamplerState
SamplerState samplerPoint { Filter = MIN_MAG_MIP_POINT; AddressU = Mirror; AddressV = Mirror; }; SamplerState samplerLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = Mirror; AddressV = Mirror; }; SamplerState samplerAniso { Filter = Anisotropic; AddressU = Mirror; AddressV = Mirror; MaxAnisotropy = 16; MaximumLod = 8; };
и в пиксельном шейдере использую по желанию samplerPoint или samplerLinear или samplerAniso.
texture.Sample(samplerPoint, Input.Texcoord);
или
texture.Sample(samplerLinear, Input.Texcoord);
или
texture.Sample(samplerAniso, Input.Texcoord);
Больше ничего особенного задаю пиксельный шеидер одну текстуру и рисую на Fullscreen Quad в окне и сжимаю окно но результат один и тот же.
Georg_GPU
> Больше ничего особенного задаю пиксельный шеидер одну текстуру и рисую на
> Fullscreen Quad в окне и сжимаю окно но результат один и тот же.
А в чем должна проявляться разница?..
Может нужен bilteral filter?
-Eugene-
разница должна быть в качестве сжатой текстуры
Georg_GPU
> разница должна быть в качестве сжатой текстуры
Фильтрация имеет мало отношения к сжатию.
Возможно вопрос глупый, но у текстуры есть mip-уровни для корректной трилинейной фильтрации?
Georg_GPU
> и сжимаю окно
если ты уменьшаешь текстуру, при этом мипмапов для неё не сгенерено, то ничего хорошего не выйдет, будет шуметь.
попробуй ID3D11DeviceContext::GenerateMips, либо даунсемпли как надо шейдером.
-Eugene-
Нет не глупый . у меня нету mip-уровни для корректной трилинейной фильтрации.
Mr F
я нашол https://msdn.microsoft.com/en-us/library/windows/desktop/bb173569(v=vs.85).aspx
то есть просто задаешь ID3D10ShaderResourceView resource для GenerateMips и потом эту resource в PSSetShaderResources, да?
Georg_GPU
> Нет не глупый . у меня нету mip-уровни для корректной трилинейной фильтрации.
В таком случае разницы и не будет. Без мип-уровней уменьшение размера работает одинаково плохо для любой фильтрации.
-Eugene-
> Без мип-уровней уменьшение размера работает одинаково плохо для любой фильтрации.
А ведь не должно по идеи. Тот же анизатропик может делать до 128 выборок. Даже если предположить 64 выборки, это квадрат 8х8, а не 2х2 как у билинейной. Т.е. если билинейка нормально держит уменьшение до 2-х раз, то анизатропик должен до 8-ми (пусть и ценой завала производительности).
Bishop
Возможно это сделано специально, чтобы не усложнять логику анизотропной фильтрации. Потому что анизотропная фильтрация создавалась для других задач и ей этот юзкейс просто не нужен. К тому же, это будет отдельный алгоритм, потому что анизотропик сэмплит пиксели на линии, а тут надо на кваде.
Я бы не советовал использовать встроенные методы генерации мипов, если нужно обеспечить хорошее качество при уменьшении текстуры.
В принципе - уменьшить картинку намного сложнее чем увеличить. Идеальный вариант - предварительно создать пару "опорных" мип-уровней руками (в фотошопе), с сохранением тех деталей, которые особо нужны.
Kashey
Идеальный вариант - предварительно создать пару "опорных" мип-уровней руками (в фотошопе)
Не получиться потому что кадры изменяються в Realtime.
Anisotropic тут вообще не к месту. Он нужен когда ты на текстуру смотришь под углом, иначе разницы с трилинейной фильтрацией быть не должно.
Используй шейдер и в нём фильтруй сам как надо.
gammaker
> Используй шейдер и в нём фильтруй сам как надо
Можеь чуть подробнее обяснить?
Тема в архиве.