6

现在<BevelBitmapEffect>(在其他效果中)已被贬值,我正在寻找如何在着色器效果中重新创建完全相同的东西(包括它的属性、BevelWidthEdgeProfileLightAngle)。ReliefSmoothness

我对像素着色有点熟悉,主要是在 Shazzam 中对整个图像/元素进行颜色处理,但如何创建斜面却让我难以理解。这是一个顶点着色器吗?如果是,我将如何开始?我已经对此进行了高低搜索,但似乎无法找到可以让我开始在<BevelBitmapEffect>custom 中复制的信息Effect

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

4

2 回答 2

4

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

于 2010-09-25T03:29:06.670 回答
3

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

理想情况下,要在硬件中完成所有操作,您将使用多通道着色器,WPF 的内置效果是多通道的,但它不允许您编写自己的。要解决此限制:

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

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

新样本

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

于 2010-09-22T00:50:38.837 回答