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
sbyte
long
、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 只接受以傳遞至 fxc.exe 旗標編譯ps_3_0
的 PS 3.0 著色器。 如需詳細資訊,請參閱 Effect-Compiler Tool。
注意
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) |