Воссоздание <BevelBitmapEffect>в пиксельном шейдере / другим методом в WPF - PullRequest
6 голосов
/ 21 сентября 2010

Теперь, когда <BevelBitmapEffect> (среди прочих эффектов) устарел, я смотрю, как можно воссоздать точно такую ​​же вещь в эффекте шейдера (включая его свойства BevelWidth, EdgeProfile,LightAngle, Relief и Smoothness).

Я немного знаком с затенением пикселей, в основном это всего лишь манипулирование цветами всего изображения / элемента в Shazzam, но как создать скос, мне не понятно.Это вершинный шейдер, и если да, то как мне начать?Я искал все выше и ниже, но, похоже, не нашел ни малейшей информации, которая позволила бы мне начать воспроизводить <BevelBitmapEffect> в пользовательском Effect.

Или, основываясь на комментарии.ниже, это 3D в WPF и если да, есть ли библиотеки кода для воссоздания <BevelBitmapEffect>, который имитирует ту, что была в предыдущих версиях WPF?

Ответы [ 2 ]

4 голосов
/ 25 сентября 2010

Есть отличная статья Рода Стивенса о DevX, в которой показано, как использовать System.Drawing для создания эффектов WPF (те, которые раньше существовали, такие как Bevel) и многое другое.Вы должны зарегистрироваться, чтобы просмотреть статью, хотя, она находится на http://www.devx.com/DevXNet/Article/45039. Исходный код для скачивания тоже.

2 голосов
/ 22 сентября 2010

Чтобы создать скос, вам нужно знать расстояние от края для каждого пикселя (искать во всех направлениях, пока альфа = 0).Из этого вы можете вычислить нормальное и затемнять его (см. Пример с Silverlight).Как вы упомянули, не так много контента о фасках, но есть несколько хороших ресурсов, если вы ищете рельефное / нормальное отображение, на которое похож затенение.В частности, этот поток имеет пример Silverlight с использованием предварительно рассчитанной карты нормалей.

Для идеального выполнения всего на аппаратном уровне вы должны использовать многопроходный шейдер, встроенные эффекты WPF являются многопроходными, но этоне позволяет вам писать свои собственные.Чтобы обойти это ограничение:

  • Вы можете создать несколько шейдеров и вложить свой элемент в несколько элементов управления, применяя разные эффекты к каждому.
  • Target WPF 4.0 и использовать Pixel Shader 3.0 дляувеличенный счетчик команд.Хотя это может быть слишком высоким требованием к оборудованию, и для PS 3.0
  • не существует запасного программного обеспечения. Выполните некоторые или все шаги в программном обеспечении.

Без выполнения одного из этих действий выВам повезет сделать скос в 3 или 4 пикселя, прежде чем вы достигнете предела команд, так как циклы, необходимые для определения расстояния, быстро увеличивают количество команд.

Новый образец

Загрузка .Вот пример, который использует PixelShader 3.0.Он использует один шейдер для определения расстояния (или высоты) до края, другой (на основе шейдеров nvidia phong ) используется для его затенения.Профили скоса создаются путем регулировки высоты ввода либо с помощью кода, либо пользовательский профиль можно использовать путем предоставления специальной текстуры.Есть некоторые другие функции, которые нужно добавить, но они кажутся легко выполнимыми для анимации свойств.Его не хватает в комментариях, но я могу объяснить детали, если это необходимо.

...