ShaderEffect Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Ger en anpassad bitmappseffekt med hjälp av en 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
- Arv
Exempel
Följande kodexempel visar hur du härleder från ShaderEffect klassen.
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
}
}
I följande kodexempel visas en skuggning som motsvarar föregående ShaderEffect klass.
// 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;
}
Följande XAML visar hur du använder den anpassade skuggningseffekten.
<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>
Kommentarer
Härled från ShaderEffect klassen för att implementera en anpassad effekt baserat på en enskild pixelskuggning.
Följande steg visar hur du skapar en anpassad effekt.
Läs in en PixelShader från förkompilerad HLSL-bytekod (High Level Shading Language).
Definiera beroendeegenskaper som representerar parametrarna för effekten och de Brush-baserade ytindata. Använd en av överlagringarna RegisterPixelShaderSamplerProperty för att associera dessa indata med registernummer som refereras till i HLSL-bytekoden.
Antalet provtagare är begränsat till 4.
Följande begränsningar gäller när du använder en PS 3.0-skuggning.
När en PS 3.0-skuggning tilldelas ökar antalet provtagare till 8. Tilldela PS 3.0-skuggningen före andra skuggningar för att aktivera registrering av 8 provtagare.
Den fullständiga skuggningskonstantens registergräns på 224 för flyttal används. Mer information finns i ps_3_0.
Följande datatyper stöds endast i PS 3.0-skuggningar. Ett undantag utlöses om dessa används i lägre skuggningsversioner.
intoch typer konvertibla tillint:uint,byte,sbyte,long,ulong,short, ,ushortcharbool
Om en giltig PS 3.0-skuggning läses in på en dator som inte har maskinvarustöd för PS 3.0 ignoreras skuggningen. Om skuggningen är ogiltig utlöses inget undantag.
Om en dator har fler än ett grafikkort definieras beteendet av det minst kompatibla grafikkortet. Om datorn till exempel har två grafikkort, varav ett stöder PS 3.0 och ett av dem inte gör det, är beteendet detsamma som om datorn inte stöder PS 3.0.
Om en dator stöder återgivning av PS 3.0 i maskinvara, men en ogiltig PS 3.0-skuggning tilldelas, InvalidPixelShaderEncountered utlöses händelsen. Ett exempel på en ogiltig PS 3.0-skuggning är en som kompilerats med
ps_3_swflaggan. Klassen ShaderEffect accepterar endast PS 3.0-skuggningar som kompileras medps_3_0flaggan som skickas till fxc.exe. Mer information finns iEffect-Compiler Tool.
Note
PS 2.0-skuggningar körs vid återgivning i programvara. Men även om PS 3.0 stöds av systemets maskinvara, körs inte PS 3.0-skuggningar under programvarurendering.
Konstruktorer
| Name | Description |
|---|---|
| ShaderEffect() |
Initierar en ny instans av ShaderEffect klassen. |
Fält
| Name | Description |
|---|---|
| PixelShaderProperty |
Identifierar beroendeegenskapen PixelShader . |
Egenskaper
| Name | Description |
|---|---|
| CanFreeze |
Hämtar ett värde som anger om objektet kan göras ommodifierbart. (Ärvd från Freezable) |
| DdxUvDdyUvRegisterIndex |
Hämtar eller anger ett värde som anger skuggningsregistret som ska användas för de partiella derivaten av texturkoordinaterna med avseende på skärmutrymme. |
| DependencyObjectType |
DependencyObjectType Hämtar som omsluter CLR-typen för den här instansen. (Ärvd från DependencyObject) |
| Dispatcher |
Hämtar det Dispatcher som DispatcherObject är associerat med. (Ärvd från DispatcherObject) |
| EffectMapping |
När det åsidosättas i en härledd klass transformerar musindata och koordinatsystem genom effekten. (Ärvd från Effect) |
| HasAnimatedProperties |
Hämtar ett värde som anger om ett eller flera AnimationClock objekt är associerade med något av det här objektets beroendeegenskaper. (Ärvd från Animatable) |
| IsFrozen |
Hämtar ett värde som anger om objektet för närvarande kan ändras. (Ärvd från Freezable) |
| IsSealed |
Hämtar ett värde som anger om den här instansen för närvarande är förseglad (skrivskyddad). (Ärvd från DependencyObject) |
| PaddingBottom |
Hämtar eller anger ett värde som anger att effektens utdatastruktur är större än dess indatastruktur längs nederkanten. |
| PaddingLeft |
Hämtar eller anger ett värde som anger att effektens utdatastruktur är större än dess indatastruktur längs vänsterkanten. |
| PaddingRight |
Hämtar eller anger ett värde som anger att effektens utdatastruktur är större än dess indatastruktur längs höger kant. |
| PaddingTop |
Hämtar eller anger ett värde som anger att effektens utdatastruktur är större än dess indatastruktur längs den övre kanten. |
| PixelShader |
Hämtar eller anger vilken PixelShader som ska användas för effekten. |
Metoder
| Name | Description |
|---|---|
| ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
Tillämpar en AnimationClock på den angivna DependencyProperty. Om egenskapen redan är animerad används den angivna HandoffBehavior . (Ärvd från Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
Tillämpar en AnimationClock på den angivna DependencyProperty. Om egenskapen redan är animerad används överlämningsbeteendet SnapshotAndReplace . (Ärvd från Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Tillämpar en animering på den angivna DependencyProperty. Animeringen startas när nästa bildruta återges. Om den angivna egenskapen redan är animerad används den angivna HandoffBehavior egenskapen. (Ärvd från Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
Tillämpar en animering på den angivna DependencyProperty. Animeringen startas när nästa bildruta återges. Om den angivna egenskapen redan är animerad används överlämningsbeteendet SnapshotAndReplace . (Ärvd från Animatable) |
| CheckAccess() |
Avgör om den anropande tråden har åtkomst till den här DispatcherObject. (Ärvd från DispatcherObject) |
| ClearValue(DependencyProperty) |
Rensar det lokala värdet för en egenskap. Egenskapen som ska rensas anges av en DependencyProperty identifierare. (Ärvd från DependencyObject) |
| ClearValue(DependencyPropertyKey) |
Rensar det lokala värdet för en skrivskyddad egenskap. Egenskapen som ska rensas anges av en DependencyPropertyKey. (Ärvd från DependencyObject) |
| Clone() |
Skapar en modifierbar klon av det här ShaderEffect objektet, vilket gör djupa kopior av objektets värden. När du kopierar det här objektets beroendeegenskaper kopierar den här metoden resursreferenser och databindningar (som kanske inte längre matchar), men inte animeringar eller deras aktuella värden. |
| CloneCore(Freezable) |
Gör instansen till en klon (djupkopia) av de angivna Freezable med hjälp av grundläggande (icke-animerade) egenskapsvärden. |
| CloneCurrentValue() |
Skapar en modifierbar klon av det här ShaderEffect objektet, vilket gör djupa kopior av objektets aktuella värden. Resursreferenser, databindningar och animeringar kopieras inte, men deras aktuella värden kopieras. |
| CloneCurrentValueCore(Freezable) |
Gör instansen till en modifierbar klon (djupkopia) av den angivna Freezable med hjälp av aktuella egenskapsvärden. |
| CoerceValue(DependencyProperty) |
Tvingar fram värdet för den angivna beroendeegenskapen. Detta uppnås genom att anropa alla CoerceValueCallback funktioner som anges i egenskapsmetadata för beroendeegenskapen eftersom den finns på anropet DependencyObject. (Ärvd från DependencyObject) |
| CreateInstance() |
Initierar en ny instans av Freezable klassen. (Ärvd från Freezable) |
| CreateInstanceCore() |
Skapar en ny instans av den Freezable härledda klassen. |
| Equals(Object) |
Avgör om en angivet DependencyObject motsvarar den aktuella DependencyObject. (Ärvd från DependencyObject) |
| Freeze() |
Gör det aktuella objektet ommodifierbart och anger dess IsFrozen egenskap till |
| FreezeCore(Boolean) |
Gör det här Animatable objektet ommodifierbart eller avgör om det kan göras ommodifierbart. (Ärvd från Animatable) |
| GetAnimationBaseValue(DependencyProperty) |
Returnerar det icke-animerade värdet för det angivna DependencyProperty. (Ärvd från Animatable) |
| GetAsFrozen() |
Skapar en frusen Freezablekopia av , med hjälp av grundläggande (icke-animerade) egenskapsvärden. Eftersom kopian är låst kopieras alla frysta underobjekt som referens. (Ärvd från Freezable) |
| GetAsFrozenCore(Freezable) |
Gör instansen till en frusen klon av den angivna Freezable med hjälp av grundläggande (icke-animerade) egenskapsvärden. |
| GetCurrentValueAsFrozen() |
Skapar en frusen Freezable kopia av med aktuella egenskapsvärden. Eftersom kopian är låst kopieras alla frysta underobjekt som referens. (Ärvd från Freezable) |
| GetCurrentValueAsFrozenCore(Freezable) |
Gör den aktuella instansen till en frusen klon av den angivna Freezable. Om objektet har animerade beroendeegenskaper kopieras deras aktuella animerade värden. |
| GetHashCode() |
Hämtar en hash-kod för den här DependencyObject. (Ärvd från DependencyObject) |
| GetLocalValueEnumerator() |
Skapar en specialiserad uppräknare för att avgöra vilka beroendeegenskaper som har lokalt angivna värden för den här DependencyObject. (Ärvd från DependencyObject) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| GetValue(DependencyProperty) |
Returnerar det aktuella effektiva värdet för en beroendeegenskap för den här instansen av en DependencyObject. (Ärvd från DependencyObject) |
| InvalidateProperty(DependencyProperty) |
Utvärderar det effektiva värdet för den angivna beroendeegenskapen igen. (Ärvd från DependencyObject) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| OnChanged() |
Anropas när det aktuella Freezable objektet ändras. (Ärvd från Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty) |
Den här medlemmen stöder infrastrukturen för Windows Presentation Foundation (WPF) och är inte avsedd att användas direkt från koden. (Ärvd från Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Ser till att lämpliga kontextpekare upprättas för en DependencyObjectType datamedlem som just har angetts. (Ärvd från Freezable) |
| OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Åsidosätter implementeringen DependencyObject av OnPropertyChanged(DependencyPropertyChangedEventArgs) för att även anropa alla Changed hanterare som svar på en ändrad beroendeegenskap av typen Freezable. (Ärvd från Freezable) |
| PixelShaderConstantCallback(Int32) |
Associerar ett beroendeegenskapsvärde med en pixelskuggares flödeskonstantregister. |
| PixelShaderSamplerCallback(Int32, SamplingMode) |
Associerar ett beroendeegenskapsvärde med en pixelskuggares exempelregister och en SamplingMode. |
| PixelShaderSamplerCallback(Int32) |
Associerar ett beroendeegenskapsvärde med en pixelskuggares exempelregister. |
| ReadLocalValue(DependencyProperty) |
Returnerar det lokala värdet för en beroendeegenskap, om den finns. (Ärvd från DependencyObject) |
| ReadPreamble() |
Säkerställer att åtkomsten Freezable görs från en giltig tråd. Arvtagare Freezable till måste anropa den här metoden i början av ett API som läser datamedlemmar som inte är beroendeegenskaper. (Ärvd från Freezable) |
| RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode) |
Associerar en beroendeegenskap med ett skuggningsexempelregister och en SamplingMode. |
| RegisterPixelShaderSamplerProperty(String, Type, Int32) |
Associerar en beroendeegenskap med ett skuggningsexempelregister. |
| SetCurrentValue(DependencyProperty, Object) |
Anger värdet för en beroendeegenskap utan att ändra dess värdekälla. (Ärvd från DependencyObject) |
| SetValue(DependencyProperty, Object) |
Anger det lokala värdet för en beroendeegenskap som anges av dess beroendeegenskapsidentifierare. (Ärvd från DependencyObject) |
| SetValue(DependencyPropertyKey, Object) |
Anger det lokala värdet för en skrivskyddad beroendeegenskap som anges av identifieraren DependencyPropertyKey för beroendeegenskapen. (Ärvd från DependencyObject) |
| ShouldSerializeProperty(DependencyProperty) |
Returnerar ett värde som anger om serialiseringsprocesser ska serialisera värdet för den angivna beroendeegenskapen. (Ärvd från DependencyObject) |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
| UpdateShaderValue(DependencyProperty) |
Meddelar effekten att skuggningskonstanten eller sampelaren som motsvarar den angivna beroendeegenskapen ska uppdateras. |
| VerifyAccess() |
Framtvingar att den anropande tråden har åtkomst till den här DispatcherObject. (Ärvd från DispatcherObject) |
| WritePostscript() |
Genererar Changed händelsen för Freezable och anropar dess OnChanged() metod. Klasser som härleds från Freezable bör anropa den här metoden i slutet av alla API:er som ändrar klassmedlemmar som inte lagras som beroendeegenskaper. (Ärvd från Freezable) |
| WritePreamble() |
Verifierar att Freezable inte är låst och att den nås från en giltig trådkontext. Freezable ärver bör anropa den här metoden i början av ett API som skriver till datamedlemmar som inte är beroendeegenskaper. (Ärvd från Freezable) |
Händelser
| Name | Description |
|---|---|
| Changed |
Inträffar när eller Freezable ett objekt som det innehåller ändras. (Ärvd från Freezable) |