Проблема пикселизации / фильтрации в Silverlight при использовании пиксельного шейдера с преобразованием вращения - PullRequest
2 голосов
/ 13 августа 2010

Я выполняю рендеринг, связанный с игрой, с помощью Silverlight, и когда я присоединяю пиксельный шейдер к изображению, которое имеет (вращательное) преобразование, я вижу странный, размытый , эффект пикселизации.1003 *

Вот скриншот проблемы.Изображение слева имеет только преобразование.Изображение справа имеет преобразование и пиксельный шейдер.

http://andrewrussell.net/offsite/2010/stack-sites/cat-girl-pixels.png

Вы можете увидеть это в действии здесь, в моем блоге (щелкните элемент управления Silverlight, чтобыдобавить пиксельный шейдер).

Речь идет о пиксельном шейдере SilverSprite, который используется для тонирования цвета изображения.Вы можете просмотреть его исходный код здесь .

Я применяю преобразование MatrixTransform (с вычисленным вручную преобразованием, масштабированием, поворотной матрицей).Проблема возникает при повороте изображения.

Элемент, к которому применяются и шейдер, и преобразование, - это Image, который добавляется к Canvas в коде.ImageSource изображения - это WriteableBitmap, но эффект также происходит с BitmapImage.

Мой вопрос: что вызывает эту нечеткую пикселизацию? и что можетбыть сделано, чтобы уменьшить или удалить его?

1 Ответ

2 голосов
/ 14 августа 2010

После просмотра этой презентации с PDC09 у меня появилось гораздо лучшее представление о том, как работает система рендеринга в Silverlight.Эта проблема не решается непосредственно в презентации, но знание порядка рендеринга вещей помогает.

Порядок шагов рендеринга, относящихся к моему вопросу: рендерится дочерние объекты (и / или сам) объекта,что рендеринг проходит через Effect, а затем проходит через RenderTransform.

. Похоже, что в любом случае, когда RenderTransform применяется к объекту, где этот объект или его дочерние элементы имели Effect применяется (то есть: RenderTransform, который приходит после и Effect в дереве рендеринга), что RenderTransform выполняется в режиме "низкого качества", который создает эту "нечеткость".

Решение, таким образом, состоит в том, чтобы переместить Effect на после на RenderTransform.В моем случае это означает установку Image на Canvas, применение RenderTransform к Image и Effect к Canvas.

...