Я выполняю рендеринг, связанный с игрой, с Silverlight, и когда я прикрепляю пиксельный шейдер к изображению, которое имеет (вращательное) преобразование, я вижу странный, нечеткий, эффект пикселизации.Проблема пикселизации/фильтрации в Silverlight при использовании пиксельного шейдера с преобразованием вращения
Вот скриншот проблемы. Изображение слева имеет только трансформацию. Изображение справа имеет преобразование и пиксельный шейдер.
http://andrewrussell.net/offsite/2010/stack-sites/cat-girl-pixels.png
Вы можете увидеть это в действии here on my blog (нажмите на Silverlight управления, чтобы добавить пиксельный шейдер).
В качестве пиксельного шейдера используется SilverSprite, который используется для оттенка цвета изображения. Вы можете view its source code here.
Преобразование, которое я применяю, представляет собой MatrixTransform
(с переводом на руки, масштабированием, поворотным матрицей). Проблема возникает при вращении изображения.
Элемент, к которому применяются шейдер и преобразование, является Image
, который добавляется в код Canvas
. Изображение ImageSource
является WriteableBitmap
, но эффект также происходит с BitmapImage
.
Мой вопрос: Что вызывает эту нечеткую пикселизацию? и что можно сделать, чтобы уменьшить или удалить его?
Это может показаться очевидным вопросом, но получаете ли вы пикселирование, если используете шейдер, но __not__ преобразование? – AnthonyWJones
@ Энтони: Интересно, да. Хотя это намного менее очевидно (это не «пух»). Выход соответствует исходному пикселю пикселя спрайта, как если бы его позиция была помещена через 'Math.Floor'. Также удалите пиксельные шейдеры, но продолжайте использовать дробные позиции, а затем спрайт будет «смешаться» между пикселями (кажется, это билинейная интерполяция). –
Также интересно, если я использую масштабирующее преобразование без вращения, то вывод будет спрайтом с билинейной фильтрацией - и то же самое, если привязать пиксельный шейдер (вероятно, он все еще делает дело «Math.Floor» упомянутое выше, но об этом невозможно сказать). Если я затем повернут расширенный спрайт, то он все равно получит эффект «нечеткого» эффекта с шейдером, но в моем исходном примере он по-прежнему находится на шкале смещения с одним выходным пикселем. –