2010-08-13 2 views
2

Я выполняю рендеринг, связанный с игрой, с 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.

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

+0

Это может показаться очевидным вопросом, но получаете ли вы пикселирование, если используете шейдер, но __not__ преобразование? – AnthonyWJones

+0

@ Энтони: Интересно, да. Хотя это намного менее очевидно (это не «пух»). Выход соответствует исходному пикселю пикселя спрайта, как если бы его позиция была помещена через 'Math.Floor'. Также удалите пиксельные шейдеры, но продолжайте использовать дробные позиции, а затем спрайт будет «смешаться» между пикселями (кажется, это билинейная интерполяция). –

+0

Также интересно, если я использую масштабирующее преобразование без вращения, то вывод будет спрайтом с билинейной фильтрацией - и то же самое, если привязать пиксельный шейдер (вероятно, он все еще делает дело «Math.Floor» упомянутое выше, но об этом невозможно сказать). Если я затем повернут расширенный спрайт, то он все равно получит эффект «нечеткого» эффекта с шейдером, но в моем исходном примере он по-прежнему находится на шкале смещения с одним выходным пикселем. –

ответ

2

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

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

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

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