ShaderEffect 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
通过使用 PixelShader 提供自定义位图效果。
public ref class ShaderEffect abstract : System::Windows::Media::Effects::Effect
public abstract class ShaderEffect : System.Windows.Media.Effects.Effect
type ShaderEffect = class
inherit Effect
Public MustInherit Class ShaderEffect
Inherits Effect
- 继承
示例
下面的代码示例演示如何从 ShaderEffect 类派生。
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Reflection;
namespace ShaderEffectDemo
{
public class ThresholdEffect : ShaderEffect
{
private static PixelShader _pixelShader =
new PixelShader() { UriSource = MakePackUri("ThresholdEffect.fx.ps") };
public ThresholdEffect()
{
PixelShader = _pixelShader;
UpdateShaderValue(InputProperty);
UpdateShaderValue(ThresholdProperty);
UpdateShaderValue(BlankColorProperty);
}
// MakePackUri is a utility method for computing a pack uri
// for the given resource.
public static Uri MakePackUri(string relativeFile)
{
Assembly a = typeof(ThresholdEffect).Assembly;
// Extract the short name.
string assemblyShortName = a.ToString().Split(',')[0];
string uriString = "pack://application:,,,/" +
assemblyShortName +
";component/" +
relativeFile;
return new Uri(uriString);
}
///////////////////////////////////////////////////////////////////////
#region Input dependency property
public Brush Input
{
get { return (Brush)GetValue(InputProperty); }
set { SetValue(InputProperty, value); }
}
public static readonly DependencyProperty InputProperty =
ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(ThresholdEffect), 0);
#endregion
///////////////////////////////////////////////////////////////////////
#region Threshold dependency property
public double Threshold
{
get { return (double)GetValue(ThresholdProperty); }
set { SetValue(ThresholdProperty, value); }
}
public static readonly DependencyProperty ThresholdProperty =
DependencyProperty.Register("Threshold", typeof(double), typeof(ThresholdEffect),
new UIPropertyMetadata(0.5, PixelShaderConstantCallback(0)));
#endregion
///////////////////////////////////////////////////////////////////////
#region BlankColor dependency property
public Color BlankColor
{
get { return (Color)GetValue(BlankColorProperty); }
set { SetValue(BlankColorProperty, value); }
}
public static readonly DependencyProperty BlankColorProperty =
DependencyProperty.Register("BlankColor", typeof(Color), typeof(ThresholdEffect),
new UIPropertyMetadata(Colors.Transparent, PixelShaderConstantCallback(1)));
#endregion
}
}
下面的代码示例演示与上 ShaderEffect 一个类对应的着色器。
// Threshold shader
// Object Declarations
sampler2D implicitInput : register(s0);
float threshold : register(c0);
float4 blankColor : register(c1);
//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 color = tex2D(implicitInput, uv);
float intensity = (color.r + color.g + color.b) / 3;
float4 result;
if (intensity > threshold)
{
result = color;
}
else
{
result = blankColor;
}
return result;
}
以下 XAML 演示如何使用自定义着色器效果。
<Window x:Class="ShaderEffectDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ShaderEffectDemo"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<local:ThresholdEffect x:Key="thresholdEffect" Threshold="0.25" BlankColor="Orange" />
</Window.Resources>
<Grid Effect="{StaticResource thresholdEffect}">
</Grid>
</Window>
注解
从 ShaderEffect 类派生,以基于单个像素着色器实现自定义效果。
以下步骤演示如何创建自定义效果。
PixelShader从预编译的高级着色语言 (HLSL) 字节代码加载 。
定义表示效果参数和基于表面输入的 Brush依赖属性。 使用其中 RegisterPixelShaderSamplerProperty 一个重载将这些输入与 HLSL 字节码中引用的寄存器号相关联。
采样器的数量限制为 4 个。
使用 PS 3.0 着色器时,以下限制适用。
分配 PS 3.0 着色器时,采样器数将增加到 8。 在其他着色器之前分配 PS 3.0 着色器,以启用注册 8 个采样器。
使用浮点数的完整着色器常量寄存器限制为 224。 有关详细信息,请参阅 ps_3_0。
以下数据类型仅在 PS 3.0 着色器中受支持。 如果在较低的着色器版本中使用它们,则会引发异常。
int
和 类型可转换为int
:uint
、、byte
、long
sbyte
、ulong
、short
、ushort
、char
bool
如果在没有硬件支持 PS 3.0 的计算机上加载了有效的 PS 3.0 着色器,则忽略该着色器。 如果着色器无效,则不会引发异常。
如果计算机有多个视频卡,则行为由最低支持的视频卡定义。 例如,如果计算机有两个视频卡,其中一个支持 PS 3.0,其中一个不支持,则行为与计算机不支持 PS 3.0 时的行为相同。
如果计算机支持在硬件中呈现 PS 3.0,但分配了无效的 PS 3.0 着色器, InvalidPixelShaderEncountered 则会引发 事件。 无效 PS 3.0 着色器的示例是使用 标志编译的
ps_3_sw
着色器。 类 ShaderEffect 仅接受使用ps_3_0
传递给 fxc.exe 的标志编译的 PS 3.0 着色器。 有关详细信息,请参阅 效果编译器工具。
注意
PS 2.0 着色器在软件中呈现时运行。 但是,即使系统硬件支持 PS 3.0,PS 3.0 着色器也不会在软件呈现期间运行。
构造函数
ShaderEffect() |
初始化 ShaderEffect 类的新实例。 |
字段
PixelShaderProperty |
标识 PixelShader 依赖项属性。 |
属性
CanFreeze |
获取一个值,该值指示是否可将对象变为不可修改。 (继承自 Freezable) |
DdxUvDdyUvRegisterIndex |
获取或设置一个值,该值指示要用于纹理坐标对屏幕空间的偏导数的着色器寄存器。 |
DependencyObjectType |
DependencyObjectType获取包装此实例的 CLR 类型的 。 (继承自 DependencyObject) |
Dispatcher |
获取与此 Dispatcher 关联的 DispatcherObject。 (继承自 DispatcherObject) |
EffectMapping |
当在派生类中重写时,通过效果转换鼠标输入和坐标系。 (继承自 Effect) |
HasAnimatedProperties |
获取一个值,该值指示一个或多个 AnimationClock 对象是否与此对象的任何依赖项属性相关联。 (继承自 Animatable) |
IsFrozen |
获取一个值,该值指示对象当前是否可修改。 (继承自 Freezable) |
IsSealed |
获取一个值,该值指示此实例当前是否为密封的(只读)。 (继承自 DependencyObject) |
PaddingBottom |
获取或设置一个值,该值指示沿下边缘方向效果的输出纹理大于其输入纹理。 |
PaddingLeft |
获取或设置一个值,该值指示沿左边缘方向效果的输出纹理大于其输入纹理。 |
PaddingRight |
获取或设置一个值,该值指示沿右边缘方向效果的输出纹理大于其输入纹理。 |
PaddingTop |
获取或设置一个值,该值指示沿上边缘方向效果的输出纹理大于其输入纹理。 |
PixelShader |
获取或设置要用于该效果的 PixelShader。 |
方法
事件
Changed |
在修改 Freezable 或其包含的对象时发生。 (继承自 Freezable) |