2012-11-02 2 views
2

Я отчаянно пытаюсь отображать изображения на 3D-поверхности в WPF с использованием выборки ближайших соседей. Ниже приведен пример того, что у меня есть, во всей его размытости. ImageBrush получает текстуру 64x64.Сэмплирование с близкого соседства в 3D WPF

Sample image.

Я попытался украшения XAML с RenderOptions.BitmapScalingMode="NearestNeighbor" везде от Window к ImageBrush без удачи. Я пробовал писать пользовательский пиксельный шейдер и не мог получить удовлетворительный результат. Даже кажется, что я не могу установить режим фильтрации сэмплера текстуры из кода шейдера. Я рассмотрел обходные задачи, например, самостоятельно масштабирование исходной текстуры, но это все равно оставит артефакты на двух из краев, где он начнет интерполировать в следующий пиксель.

Подводя итог: Можно ли каким-либо образом выполнить эффект выборки ближайшего соседа на 3D-модели в WPF?

ответ

1

Просто у той же проблемы, ответ в this thread обеспечивает обходное решение.

Вы можете использовать VisualBrush с изображением, тогда WPF будет уважать BitmapScalingMode на изображении. Вы также можете установить CachingHint (также на RenderOptions), который может повысить производительность (хотя и не измерял его).

var image = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/Resources/image.png")) }; 
RenderOptions.SetCachingHint(image, CachingHint.Cache); 
RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.NearestNeighbor); 
var material = new DiffuseMaterial(new VisualBrush(image)); 

Это работает для простых сцен, как я сказал, что я не измерить производительность, но я себе визуал повредит для больших вещей (по сравнению с ImageBrush). Лично я переключусь на Direct3D interop и сделаю сцену через SharpDX, когда я ударил эту проблему.