在WPF中的像素着色器/其他方法中重新创建<bevelbitmapeffect> </bevelbitmapeffect>

时间:2010-09-21 18:52:05

标签: wpf 3d pixel-shader

既然<BevelBitmapEffect>(以及其他效果)已被折旧,我想看看如何在着色器效果中重新创建完全相同的东西(包括BevelWidth的属性, EdgeProfileLightAngleReliefSmoothness)。

我对像素着色很熟悉,大多数只是Shazzam中整个图像/元素的颜色处理,但是如何创建斜角使我望而却步。这是一个顶点着色器,如果是这样,我将如何开始?我已经对此进行了高调和低调,但似乎无法找到一些信息,这些信息可以让我开始在自定义<BevelBitmapEffect>中复制Effect

或者,根据下面的评论,这是WPF中的3D,如果有的话,是否有代码库用于重新创建模仿WPF以前版本的<BevelBitmapEffect>

2 个答案:

答案 0 :(得分:4)

Rod Stephens在DevX上发表了一篇很棒的文章,展示了如何使用System.Drawing创建WPF效果(以前存在的效果,如Bevel)等等。你必须注册才能查看这篇文章,它位于http://www.devx.com/DevXNet/Article/45039。可下载的源代码。

答案 1 :(得分:2)

要创建斜角,您需要知道每个像素距边缘的距离(在所有方向搜索,直到alpha = 0)。从这里你可以calculate the normal然后遮阴(参见silverlight示例)。正如您所提到的,关于斜面的内容并不多,但如果您搜索着色相似的凹凸贴图/法线贴图,则会有一些很好的资源。特别是this thread使用预先计算的法线贴图的Silverlight示例。

要在硬件中做所有事情,理想情况下你会使用多遍着色器,WPF的内置效果是多遍的,但它不允许你自己编写。 要解决此限制:

  • 您可以创建多个着色器,并将元素嵌套在多个控件中,对每个控件应用不同的效果。
  • 目标WPF 4.0并使用Pixel Shader 3.0,以增加指令数。虽然这可能是一个太高的硬件要求,并且没有PS 3.0的软件回退
  • 执行软件中的部分或全部步骤。

如果不执行其中一项操作,您很幸运能够在达到指令限制之前执行3或4像素斜角,因为找到距离所需的循环会快速增加指令计数。

新样本

Download。这是一个使用PixelShader 3.0的示例。它使用一个着色器查找到边缘的距离(也称为高度),另一个(基于nvidia phong shaders)用于遮蔽它。通过使用代码调整输入高度来创建斜面轮廓,或者可以通过提供特殊纹理来使用自定义轮廓。还有一些其他功能需要添加,但它似乎很容易高效地为属性设置动画。它缺乏评论,但我可以在需要时解释部分。