ShaderEffect Třída

Definice

Poskytuje vlastní rastrový efekt pomocí objektu 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
Dědičnost

Příklady

Následující příklad kódu ukazuje, jak odvodit z ShaderEffect třídy .

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
    }
}

Následující příklad kódu ukazuje shader, který odpovídá předchozí ShaderEffect třídě.

// 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;
}

Následující kód XAML ukazuje, jak používat vlastní efekt shaderu.

<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>

Poznámky

Odvození z ShaderEffect třídy pro implementaci vlastního efektu založeného na jednom pixel shaderu.

Následující kroky ukazují, jak vytvořit vlastní efekt.

  1. PixelShader Načtěte z předkompilovaného bajtového kódu hlsl (High Level Shading Language).

  2. Definujte vlastnosti závislostí, které představují parametry efektu a vstupy povrchu založené na Brush. Pomocí jednoho z přetížení přidružte RegisterPixelShaderSamplerProperty tyto vstupy k číslům registru, na která se odkazuje v bajtovém kódu HLSL.

Počet vzorkovačů je omezen na 4.

Při použití shaderu PS 3.0 platí následující omezení.

  • Při přiřazení shaderu PS 3.0 se počet vzorkovačů zvýší na 8. Pokud chcete povolit registraci 8 vzorkovačů, přiřaďte shader PS 3.0 před ostatními shadery.

  • Používá se limit úplného registru shaderu 224 pro floaty. Další informace najdete v tématu ps_3_0.

  • Následující datové typy jsou podporovány pouze v shaderech PS 3.0. Pokud se používají v nižších verzích shaderu, dojde k výjimce.

    • inta typy převoditelné na int: uint, byte, sbyte, long, ulong, , short, ushortchar

    • bool

  • Pokud je na počítači, který nemá hardwarovou podporu pro PS 3.0, načten platný shader PS 3.0, bude shader ignorován. Pokud je shader neplatný, nevyvolá se žádná výjimka.

  • Pokud má počítač více než jednu grafickou kartu, je chování definováno nejméně schopnou grafickou kartou. Například pokud má počítač dvě grafické karty, z nichž jedna podporuje PS 3.0 a jedna z nich ne, chování je stejné, jako kdyby počítač nepodporuje PS 3.0.

  • Pokud počítač podporuje vykreslování PS 3.0 v hardwaru, ale je přiřazen neplatný shader PS 3.0, InvalidPixelShaderEncountered událost je vyvolána. Příkladem neplatného shaderu PS 3.0 je zkompilovaný s příznakem ps_3_sw . Třída ShaderEffect přijímá pouze shadery PS 3.0, které jsou kompilovány s příznakem ps_3_0 předaným fxc.exe. Další informace najdete v tématu Effect-Compiler Tool.

Poznámka

Shadery PS 2.0 běží při vykreslování v softwaru. I když je však systém PS 3.0 podporován hardwarem systému, shadery PS 3.0 se při vykreslování softwaru nespustí.

Konstruktory

ShaderEffect()

Inicializuje novou instanci ShaderEffect třídy .

Pole

PixelShaderProperty

Identifikuje PixelShader vlastnost závislosti.

Vlastnosti

CanFreeze

Získá hodnotu, která označuje, zda objekt lze změnit.

(Zděděno od Freezable)
DdxUvDdyUvRegisterIndex

Získá nebo nastaví hodnotu, která označuje registr shaderu použít pro částečné deriváty souřadnic textury s ohledem na prostor na obrazovce.

DependencyObjectType

Získá, DependencyObjectType který zabalí typ CLR této instance.

(Zděděno od DependencyObject)
Dispatcher

Získá to DispatcherDispatcherObject je přidružena k.

(Zděděno od DispatcherObject)
EffectMapping

Při přepsání v odvozené třídě transformuje vstupní a souřadnicové systémy myši prostřednictvím efektu .

(Zděděno od Effect)
HasAnimatedProperties

Získá hodnotu, která označuje, zda jeden nebo více AnimationClock objektů je přidružena k některému z vlastností závislostí tohoto objektu.

(Zděděno od Animatable)
IsFrozen

Získá hodnotu, která označuje, zda je objekt aktuálně upravitelný.

(Zděděno od Freezable)
IsSealed

Získá hodnotu, která označuje, zda je tato instance právě zapečetěna (jen pro čtení).

(Zděděno od DependencyObject)
PaddingBottom

Získá nebo nastaví hodnotu označující, že výstupní textura efektu je větší než jeho vstupní textura podél dolního okraje.

PaddingLeft

Získá nebo nastaví hodnotu označující, že výstupní textura efektu je větší než jeho vstupní textura podél levého okraje.

PaddingRight

Získá nebo nastaví hodnotu označující, že výstupní textura efektu je větší než jeho vstupní textura podél pravého okraje.

PaddingTop

Získá nebo nastaví hodnotu označující, že výstupní textura efektu je větší než jeho vstupní textura podél horního okraje.

PixelShader

Získá nebo nastaví PixelShader na použití pro efekt.

Metody

ApplyAnimationClock(DependencyProperty, AnimationClock)

Použije na AnimationClock zadanou DependencyPropertyhodnotu . Pokud je vlastnost už animovaná, SnapshotAndReplace použije se chování předání.

(Zděděno od Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Použije na AnimationClock zadanou DependencyPropertyhodnotu . Pokud je vlastnost už animovaná, použije se zadaná HandoffBehavior vlastnost.

(Zděděno od Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Použije animaci na zadaný objekt DependencyProperty. Animace se spustí při vykreslení dalšího snímku. Pokud je zadaná vlastnost již animované, SnapshotAndReplace použije se chování předání.

(Zděděno od Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Použije animaci na zadaný objekt DependencyProperty. Animace se spustí při vykreslení dalšího snímku. Pokud je zadaná vlastnost již animovaná, použije se zadaná HandoffBehavior vlastnost.

(Zděděno od Animatable)
CheckAccess()

Určuje, zda volající vlákno má přístup k tomuto DispatcherObject.

(Zděděno od DispatcherObject)
ClearValue(DependencyProperty)

Vymaže místní hodnotu vlastnosti. Vlastnost, která má být vymazána, je určena identifikátorem DependencyProperty .

(Zděděno od DependencyObject)
ClearValue(DependencyPropertyKey)

Vymaže místní hodnotu vlastnosti jen pro čtení. Vlastnost, která se má vymazat, je určena parametrem DependencyPropertyKey.

(Zděděno od DependencyObject)
Clone()

Vytvoří upravitelný klon tohoto ShaderEffect objektu a vytvoří hluboké kopie hodnot tohoto objektu. Při kopírování vlastností závislostí tohoto objektu tato metoda kopíruje odkazy na prostředky a datové vazby (které již nemusí přeložit), ale ne animace nebo jejich aktuální hodnoty.

CloneCore(Freezable)

Vytvoří instanci klon (hloubkovou kopii) zadaného Freezable pomocí základních (ne animovaných) hodnot vlastností.

CloneCurrentValue()

Vytvoří upravitelný klon tohoto ShaderEffect objektu a vytvoří hluboké kopie aktuálních hodnot tohoto objektu. Odkazy na prostředky, datové vazby a animace se nekopírují, ale zkopírují se jejich aktuální hodnoty.

CloneCurrentValueCore(Freezable)

Vytvoří instanci upravitelný klon (hloubkovou kopii) zadaného Freezable pomocí aktuálních hodnot vlastností.

CoerceValue(DependencyProperty)

Převede hodnotu zadané vlastnosti závislosti. Toho se dosáhne vyvoláním jakékoli CoerceValueCallback funkce zadané v metadatech vlastnosti závislosti, protože existuje ve volajícím DependencyObjectobjektu .

(Zděděno od DependencyObject)
CreateInstance()

Inicializuje novou instanci Freezable třídy .

(Zděděno od Freezable)
CreateInstanceCore()

Vytvoří novou instanci odvozené Freezable třídy.

Equals(Object)

Určuje, zda zadaný DependencyObject je ekvivalentní k aktuálnímu DependencyObject.

(Zděděno od DependencyObject)
Freeze()

Nastaví aktuální objekt jako neupravitelný a nastaví jeho IsFrozen vlastnost na true.

(Zděděno od Freezable)
FreezeCore(Boolean)

Nastaví tento Animatable objekt jako neupravitelný nebo určuje, zda jej lze změnit jako neupravitelný.

(Zděděno od Animatable)
GetAnimationBaseValue(DependencyProperty)

Vrátí ne animovanou hodnotu zadané DependencyPropertyhodnoty .

(Zděděno od Animatable)
GetAsFrozen()

Vytvoří zamrzlou kopii objektu Freezables použitím základních (ne animovaných) hodnot vlastností. Vzhledem k tomu, že kopie je zamrzlá, jsou všechny ukotvené dílčí objekty zkopírovány odkazem.

(Zděděno od Freezable)
GetAsFrozenCore(Freezable)

Vytvoří instanci zamrznutý klon zadaného Freezable pomocí základních (ne animovaných) hodnot vlastností.

GetCurrentValueAsFrozen()

Vytvoří zamrzlou kopii objektu Freezable s použitím aktuálních hodnot vlastností. Vzhledem k tomu, že kopie je zamrzlá, jsou všechny ukotvené dílčí objekty zkopírovány odkazem.

(Zděděno od Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Vytvoří aktuální instanci zablokovaného klonu zadaného Freezableobjektu . Pokud má objekt animované vlastnosti závislostí, zkopírují se jeho aktuální animované hodnoty.

GetHashCode()

Získá hash kód pro tento DependencyObject.

(Zděděno od DependencyObject)
GetLocalValueEnumerator()

Vytvoří specializovaný enumerátor pro určení vlastností závislostí, které mají místně nastavené hodnoty v tomto DependencyObjectobjektu .

(Zděděno od DependencyObject)
GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
GetValue(DependencyProperty)

Vrátí aktuální efektivní hodnotu vlastnosti závislosti na této instanci objektu DependencyObject.

(Zděděno od DependencyObject)
InvalidateProperty(DependencyProperty)

Znovu vyhodnotí efektivní hodnotu pro zadanou vlastnost závislosti.

(Zděděno od DependencyObject)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
OnChanged()

Volána při změně aktuálního Freezable objektu.

(Zděděno od Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Zajišťuje, že jsou vytvořeny vhodné ukazatele kontextu pro DependencyObjectType datový člen, který byl právě nastaven.

(Zděděno od Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Tento člen podporuje infrastrukturu Windows Presentation Foundation (WPF) a není určen k použití přímo z vašeho kódu.

(Zděděno od Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Přepíše implementaci DependencyObject tak, OnPropertyChanged(DependencyPropertyChangedEventArgs) aby také vyvolala všechny Changed obslužné rutiny v reakci na měnící se vlastnost závislosti typu Freezable.

(Zděděno od Freezable)
PixelShaderConstantCallback(Int32)

Přidruží hodnotu vlastnosti závislosti k registru plovoucí konstanty pixel shader.

PixelShaderSamplerCallback(Int32)

Přidruží hodnotu vlastnosti závislosti k registru vzorkovače pixel shaderu.

PixelShaderSamplerCallback(Int32, SamplingMode)

Přidruží hodnotu vlastnosti závislosti k registru vzorkovníku pixel shaderu a objektu SamplingMode.

ReadLocalValue(DependencyProperty)

Vrátí místní hodnotu vlastnosti závislosti, pokud existuje.

(Zděděno od DependencyObject)
ReadPreamble()

Zajišťuje, že Freezable se k souboru přistupuje z platného vlákna. Dědíci Freezable musí tuto metodu volat na začátku jakéhokoli rozhraní API, které čte datové členy, které nejsou vlastnosti závislostí.

(Zděděno od Freezable)
RegisterPixelShaderSamplerProperty(String, Type, Int32)

Přidruží vlastnost závislosti k registru vzorkovače shaderu.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Přidruží vlastnost závislosti k registru vzorkovníku shaderu a objektu SamplingMode.

SetCurrentValue(DependencyProperty, Object)

Nastaví hodnotu vlastnosti závislosti beze změny jejího zdroje hodnoty.

(Zděděno od DependencyObject)
SetValue(DependencyProperty, Object)

Nastaví místní hodnotu vlastnosti závislosti určenou identifikátorem vlastnosti závislosti.

(Zděděno od DependencyObject)
SetValue(DependencyPropertyKey, Object)

Nastaví místní hodnotu vlastnosti závislosti jen pro čtení určenou DependencyPropertyKey identifikátorem vlastnosti závislosti.

(Zděděno od DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Vrátí hodnotu, která označuje, zda serializační procesy mají serializovat hodnotu pro zadanou vlastnost závislosti.

(Zděděno od DependencyObject)
ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)
UpdateShaderValue(DependencyProperty)

Upozorní, že by se měla aktualizovat konstanta shaderu nebo vzorkovník odpovídající zadané vlastnosti závislosti.

VerifyAccess()

Vynucuje, že volající vlákno má přístup k tomuto DispatcherObject.

(Zděděno od DispatcherObject)
WritePostscript()

Changed Vyvolá událost pro Freezable a vyvolá jeho OnChanged() metodu. Třídy odvozené z Freezable by měly tuto metodu volat na konci jakéhokoli rozhraní API, které upravuje členy třídy, které nejsou uloženy jako vlastnosti závislosti.

(Zděděno od Freezable)
WritePreamble()

Ověřuje, že Freezable objekt není zamrznutý a že se k němu přistupuje z platného kontextu podprocesů. Freezable Dědiče by tuto metodu měli volat na začátku jakéhokoli rozhraní API, které zapisuje do datových členů, které nejsou vlastnosti závislostí.

(Zděděno od Freezable)

Událost

Changed

Vyvolá se při změně objektu Freezable nebo objektu, který obsahuje.

(Zděděno od Freezable)

Platí pro

Viz také