ShaderEffect Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Biedt een aangepast bitmapeffect met behulp van een 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
- Overname
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u deze kunt afleiden uit de ShaderEffect klasse.
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
}
}
In het volgende codevoorbeeld ziet u een shader die overeenkomt met de vorige ShaderEffect klasse.
// 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;
}
In de volgende XAML ziet u hoe u het aangepaste shader-effect gebruikt.
<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>
Opmerkingen
Afgeleid van de ShaderEffect klasse om een aangepast effect te implementeren op basis van één pixel shader.
In de volgende stappen ziet u hoe u een aangepast effect maakt.
Laad een PixelShader bytecode van vooraf gecompileerde HLSL -bytecode (High Level Shading Language).
Definieer afhankelijkheidseigenschappen die de parameters van het effect en de Brushop -gebaseerde surface-invoer vertegenwoordigen. Gebruik een van de RegisterPixelShaderSamplerProperty overbelastingen om deze invoer te koppelen aan registernummers waarnaar wordt verwezen in de HLSL-bytecode.
Het aantal samplers is beperkt tot 4.
De volgende beperkingen gelden voor het gebruik van een PS 3.0-shader.
Wanneer een PS 3.0-shader wordt toegewezen, neemt het aantal samplers toe tot 8. Wijs de PS 3.0-shader toe vóór andere shaders om het registreren van 8 samplers mogelijk te maken.
De volledige arceringsconstante registerlimiet van 224 voor floats wordt gebruikt. Zie ps_3_0 voor meer informatie.
De volgende gegevenstypen worden alleen ondersteund in PS 3.0-shaders. Er wordt een uitzondering gegenereerd als deze worden gebruikt in lagere arceringsversies.
inten typen converteerbaar naarint:uint,byte,sbyte,long,ulong, ,shortushortcharbool
Als een geldige PS 3.0-shader wordt geladen op een computer die geen hardwareondersteuning voor PS 3.0 heeft, wordt de shader genegeerd. Als de shader ongeldig is, wordt er geen uitzondering gegenereerd.
Als een computer meer dan één videokaart heeft, wordt het gedrag gedefinieerd door de minst geschikte videokaart. Als de computer bijvoorbeeld twee videokaarten heeft, waarvan één ps 3.0 ondersteunt en een daarvan niet, is het gedrag hetzelfde als als de computer ps 3.0 niet ondersteunt.
Als een computer ondersteuning biedt voor het weergeven van PS 3.0 in hardware, maar er een ongeldige PS 3.0-shader is toegewezen, wordt de InvalidPixelShaderEncountered gebeurtenis gegenereerd. Een voorbeeld van een ongeldige PS 3.0-shader is één die is gecompileerd met de
ps_3_swvlag. De ShaderEffect klasse accepteert alleen PS 3.0-shaders die zijn gecompileerd met deps_3_0vlag die is doorgegeven aan fxc.exe. Zie Effect-Compiler Tool voor meer informatie.
Note
PS 2.0 shaders worden uitgevoerd wanneer ze worden weergegeven in software. Zelfs als PS 3.0 wordt ondersteund door de hardware van het systeem, worden PS 3.0-shaders niet uitgevoerd tijdens softwarerendering.
Constructors
| Name | Description |
|---|---|
| ShaderEffect() |
Initialiseert een nieuw exemplaar van de ShaderEffect klasse. |
Velden
| Name | Description |
|---|---|
| PixelShaderProperty |
Identificeert de PixelShader afhankelijkheidseigenschap. |
Eigenschappen
| Name | Description |
|---|---|
| CanFreeze |
Hiermee wordt een waarde opgehaald die aangeeft of het object onmodieerbaar kan worden gemaakt. (Overgenomen van Freezable) |
| DdxUvDdyUvRegisterIndex |
Hiermee wordt een waarde opgehaald of ingesteld die aangeeft dat het shader-register moet worden gebruikt voor de gedeeltelijke derivaten van de patrooncoördinaten met betrekking tot de schermruimte. |
| DependencyObjectType |
Hiermee haalt u het DependencyObjectType CLR-type van dit exemplaar op. (Overgenomen van DependencyObject) |
| Dispatcher |
Hiermee wordt de Dispatcher aan dit DispatcherObject gekoppelde bestand. (Overgenomen van DispatcherObject) |
| EffectMapping |
Wanneer deze worden overschreven in een afgeleide klasse, transformeert u de invoer van de muis en coördineert u systemen via het effect. (Overgenomen van Effect) |
| HasAnimatedProperties |
Hiermee wordt een waarde opgehaald die aangeeft of een of meer AnimationClock objecten zijn gekoppeld aan een van de afhankelijkheidseigenschappen van dit object. (Overgenomen van Animatable) |
| IsFrozen |
Hiermee wordt een waarde opgehaald die aangeeft of het object momenteel kan worden gewijzigd. (Overgenomen van Freezable) |
| IsSealed |
Hiermee wordt een waarde opgehaald die aangeeft of dit exemplaar momenteel is verzegeld (alleen-lezen). (Overgenomen van DependencyObject) |
| PaddingBottom |
Hiermee wordt een waarde opgehaald of ingesteld die aangeeft dat het uitvoerpatroon van het effect groter is dan het invoerpatroon langs de onderrand. |
| PaddingLeft |
Hiermee wordt een waarde opgehaald of ingesteld die aangeeft dat het uitvoerpatroon van het effect groter is dan het invoerpatroon aan de linkerkant. |
| PaddingRight |
Hiermee wordt een waarde opgehaald of ingesteld die aangeeft dat het uitvoerpatroon van het effect groter is dan het invoerpatroon langs de rechterrand. |
| PaddingTop |
Hiermee wordt een waarde opgehaald of ingesteld die aangeeft dat het uitvoerpatroon van het effect groter is dan het invoerpatroon langs de bovenrand. |
| PixelShader |
Hiermee haalt u het PixelShader te gebruiken voor het effect op of stelt u deze in. |
Methoden
| Name | Description |
|---|---|
| ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
Hiermee wordt een AnimationClock op de opgegeven DependencyPropertywaarde toegepast. Als de eigenschap al is geanimeerd, wordt de opgegeven HandoffBehavior waarde gebruikt. (Overgenomen van Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
Hiermee wordt een AnimationClock op de opgegeven DependencyPropertywaarde toegepast. Als de eigenschap al is geanimeerd, wordt het SnapshotAndReplace handoff-gedrag gebruikt. (Overgenomen van Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Hiermee past u een animatie toe op de opgegeven DependencyProperty. De animatie wordt gestart wanneer het volgende frame wordt weergegeven. Als de opgegeven eigenschap al is geanimeerd, wordt de opgegeven HandoffBehavior gebruikt. (Overgenomen van Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
Hiermee past u een animatie toe op de opgegeven DependencyProperty. De animatie wordt gestart wanneer het volgende frame wordt weergegeven. Als de opgegeven eigenschap al is geanimeerd, wordt het SnapshotAndReplace handoff-gedrag gebruikt. (Overgenomen van Animatable) |
| CheckAccess() |
Bepaalt of de aanroepende thread toegang heeft tot dit DispatcherObject. (Overgenomen van DispatcherObject) |
| ClearValue(DependencyProperty) |
Hiermee wist u de lokale waarde van een eigenschap. De eigenschap die moet worden gewist, wordt opgegeven door een DependencyProperty id. (Overgenomen van DependencyObject) |
| ClearValue(DependencyPropertyKey) |
Hiermee wist u de lokale waarde van een alleen-lezen eigenschap. De eigenschap die moet worden gewist, wordt opgegeven door een DependencyPropertyKey. (Overgenomen van DependencyObject) |
| Clone() |
Hiermee maakt u een wijzigbare kloon van dit ShaderEffect object, waardoor diepe kopieën van de waarden van dit object worden gemaakt. Bij het kopiëren van de afhankelijkheidseigenschappen van dit object kopieert deze methode bronverwijzingen en gegevensbindingen (die mogelijk niet meer worden omgezet), maar niet animaties of hun huidige waarden. |
| CloneCore(Freezable) |
Hiermee wordt het exemplaar een kloon (diepe kopie) van de opgegeven Freezable met behulp van basiseigenschapswaarden (niet-geanimeerde waarden). |
| CloneCurrentValue() |
Hiermee maakt u een wijzigbare kloon van dit ShaderEffect object, waardoor diepe kopieën worden gemaakt van de huidige waarden van dit object. Resourceverwijzingen, gegevensbindingen en animaties worden niet gekopieerd, maar de huidige waarden worden gekopieerd. |
| CloneCurrentValueCore(Freezable) |
Maakt het exemplaar een wijzigbare kloon (diepe kopie) van de opgegeven Freezable met behulp van de huidige eigenschapswaarden. |
| CoerceValue(DependencyProperty) |
Hiermee wordt de waarde van de opgegeven afhankelijkheidseigenschap gecodeerd. Dit wordt bereikt door een CoerceValueCallback functie aan te roepen die is opgegeven in eigenschapsmetagegevens voor de afhankelijkheidseigenschap, zoals deze bestaat bij het aanroepen DependencyObject. (Overgenomen van DependencyObject) |
| CreateInstance() |
Initialiseert een nieuw exemplaar van de Freezable klasse. (Overgenomen van Freezable) |
| CreateInstanceCore() |
Hiermee maakt u een nieuw exemplaar van de Freezable afgeleide klasse. |
| Equals(Object) |
Bepaalt of een opgegeven DependencyObject gelijk is aan de huidige DependencyObject. (Overgenomen van DependencyObject) |
| Freeze() |
Maakt het huidige object onmodifieerbaar en stelt de IsFrozen eigenschap ervan in op |
| FreezeCore(Boolean) |
Animatable Dit object kan niet worden gewijzigd of bepaalt of het kan worden gewijzigd. (Overgenomen van Animatable) |
| GetAnimationBaseValue(DependencyProperty) |
Retourneert de niet-geanimeerde waarde van de opgegeven DependencyProperty. (Overgenomen van Animatable) |
| GetAsFrozen() |
Hiermee maakt u een geblokkeerde kopie van de Freezableeigenschapswaarden met basiswaarden (niet-geanimeerd). Omdat de kopie is geblokkeerd, worden alle geblokkeerde subobjecten gekopieerd met verwijzing. (Overgenomen van Freezable) |
| GetAsFrozenCore(Freezable) |
Hiermee wordt het exemplaar een geblokkeerde kloon van de opgegeven Freezable met behulp van basiseigenschapswaarden (niet-geanimeerd). |
| GetCurrentValueAsFrozen() |
Hiermee maakt u een geblokkeerde kopie van het Freezable gebruik van de huidige eigenschapswaarden. Omdat de kopie is geblokkeerd, worden alle geblokkeerde subobjecten gekopieerd met verwijzing. (Overgenomen van Freezable) |
| GetCurrentValueAsFrozenCore(Freezable) |
Hiermee wordt het huidige exemplaar een geblokkeerde kloon van de opgegeven Freezable. Als het object eigenschappen van afhankelijkheid met animatie heeft, worden de huidige geanimeerde waarden gekopieerd. |
| GetHashCode() |
Hiermee haalt u een hashcode op.DependencyObject (Overgenomen van DependencyObject) |
| GetLocalValueEnumerator() |
Hiermee maakt u een gespecialiseerde enumerator om te bepalen welke afhankelijkheidseigenschappen lokaal waarden hebben ingesteld.DependencyObject (Overgenomen van DependencyObject) |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| GetValue(DependencyProperty) |
Retourneert de huidige effectieve waarde van een afhankelijkheidseigenschap op dit exemplaar van een DependencyObject. (Overgenomen van DependencyObject) |
| InvalidateProperty(DependencyProperty) |
Evalueert de effectieve waarde voor de opgegeven afhankelijkheidseigenschap opnieuw. (Overgenomen van DependencyObject) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| OnChanged() |
Aangeroepen wanneer het huidige Freezable object wordt gewijzigd. (Overgenomen van Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty) |
Dit lid ondersteunt de Windows Presentation Foundation -infrastructuur (WPF) en is niet bedoeld om rechtstreeks vanuit uw code te worden gebruikt. (Overgenomen van Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Zorgt ervoor dat de juiste contextpointers tot stand worden gebracht voor een DependencyObjectType gegevenslid dat zojuist is ingesteld. (Overgenomen van Freezable) |
| OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Overschrijft de DependencyObject implementatie van het aanroepen OnPropertyChanged(DependencyPropertyChangedEventArgs) van Changed handlers als reactie op een veranderende afhankelijkheidseigenschap van het typeFreezable. (Overgenomen van Freezable) |
| PixelShaderConstantCallback(Int32) |
Koppelt een afhankelijkheidseigenschapswaarde aan het floatconstante register van een pixel-shader. |
| PixelShaderSamplerCallback(Int32, SamplingMode) |
Koppelt een waarde van een afhankelijkheidseigenschap aan het samplerregister van een pixel-shader en een SamplingMode. |
| PixelShaderSamplerCallback(Int32) |
Koppelt een waarde van een afhankelijkheidseigenschap aan het samplerregister van een pixel-shader. |
| ReadLocalValue(DependencyProperty) |
Retourneert de lokale waarde van een afhankelijkheidseigenschap, als deze bestaat. (Overgenomen van DependencyObject) |
| ReadPreamble() |
Zorgt ervoor dat de Freezable thread wordt geopend vanuit een geldige thread. Overnames van Freezable deze methode moeten aan het begin van een API worden aangeroepen die gegevensleden leest die geen afhankelijkheidseigenschappen zijn. (Overgenomen van Freezable) |
| RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode) |
Koppelt een afhankelijkheidseigenschap aan een shader-samplerregister en een SamplingMode. |
| RegisterPixelShaderSamplerProperty(String, Type, Int32) |
Koppelt een afhankelijkheidseigenschap aan een shader sampler-register. |
| SetCurrentValue(DependencyProperty, Object) |
Hiermee stelt u de waarde van een afhankelijkheidseigenschap in zonder de waardebron te wijzigen. (Overgenomen van DependencyObject) |
| SetValue(DependencyProperty, Object) |
Hiermee stelt u de lokale waarde van een afhankelijkheidseigenschap in, die is opgegeven door de id van de afhankelijkheidseigenschap. (Overgenomen van DependencyObject) |
| SetValue(DependencyPropertyKey, Object) |
Hiermee stelt u de lokale waarde van een alleen-lezen afhankelijkheidseigenschap in, die is opgegeven door de DependencyPropertyKey id van de afhankelijkheidseigenschap. (Overgenomen van DependencyObject) |
| ShouldSerializeProperty(DependencyProperty) |
Retourneert een waarde die aangeeft of serialisatieprocessen de waarde voor de opgegeven afhankelijkheidseigenschap moeten serialiseren. (Overgenomen van DependencyObject) |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |
| UpdateShaderValue(DependencyProperty) |
Hiermee wordt het effect aangegeven dat de arceringsconstante of sampler die overeenkomt met de opgegeven afhankelijkheidseigenschap moet worden bijgewerkt. |
| VerifyAccess() |
Hiermee wordt afgedwongen dat de aanroepende thread toegang heeft tot dit DispatcherObject. (Overgenomen van DispatcherObject) |
| WritePostscript() |
Hiermee wordt de gebeurtenis voor de Changed gebeurtenis gegenereerd en wordt Freezable de OnChanged() methode aangeroepen. Klassen die zijn afgeleid van Freezable , moeten deze methode aan het einde van een API aanroepen die klasseleden wijzigt die niet zijn opgeslagen als afhankelijkheidseigenschappen. (Overgenomen van Freezable) |
| WritePreamble() |
Controleert of het Freezable niet is geblokkeerd en of deze wordt geopend vanuit een geldige threadingcontext. Freezable overnemers moeten deze methode aan het begin van een API aanroepen die schrijft naar gegevensleden die geen afhankelijkheidseigenschappen zijn. (Overgenomen van Freezable) |
gebeurtenis
| Name | Description |
|---|---|
| Changed |
Treedt op wanneer het Freezable object dat het bevat, wordt gewijzigd. (Overgenomen van Freezable) |