ShaderEffect Třída

Definice

Poskytuje vlastní rastrový efekt pomocí .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í XAML ukazuje, jak použít 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

Odvozujte z ShaderEffect třídy k implementaci vlastního efektu na základě jednoho 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 jazyka HLSL (High Level Shading Language).

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

Počet vzorkovníků je omezen na hodnotu 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 vzorkovníků zvýší na 8. Před dalšími shadery přiřaďte shader PS 3.0, aby bylo možné zaregistrovat 8 vzorkovníků.

  • Použije se limit 224 konstantního registru úplného shaderu pro plovoucí hodnoty. Další informace najdete v tématu ps_3_0.

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

    • inta typy konvertibilní na int: uint, byte, sbytelongulong, short, , , ushortchar

    • bool

  • Pokud je v počítači, který nemá podporu hardwaru pro PS 3.0, načte platný shader PS 3.0, bude shader ignorován. Pokud je shader neplatný, není vyvolán žádná výjimka.

  • Pokud má počítač více než jednu grafickou kartu, je chování definováno nejméně schopnou grafickou kartou. Pokud má například počítač dvě grafické karty, jeden z nich podporuje PS 3.0 a jeden z nich není, chování je stejné jako v případě, že 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 vyvolá se událost. Příkladem neplatného shaderu PS 3.0 je jeden zkompilovaný s příznakem ps_3_sw . Třída ShaderEffect přijímá pouze shadery PS 3.0, které jsou zkompilovány s příznakem ps_3_0 předaným fxc.exe. Další informace najdete v tématu Effect-Compiler Tool.

Note

Shadery PS 2.0 se spouštějí při vykreslování v softwaru. I když je však hardware systému PS 3.0 podporovaný, shadery PS 3.0 se během vykreslování softwaru nespustí.

Konstruktory

Name Description
ShaderEffect()

Inicializuje novou instanci ShaderEffect třídy.

Pole

Name Description
PixelShaderProperty

Identifikuje PixelShader vlastnost závislosti.

Vlastnosti

Name Description
CanFreeze

Získá hodnotu, která označuje, zda objekt lze vytvořit nemodifovatelný.

(Zděděno od Freezable)
DdxUvDdyUvRegisterIndex

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

DependencyObjectType

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

(Zděděno od DependencyObject)
Dispatcher

Dispatcher Získá toto DispatcherObject je přidružené.

(Zděděno od DispatcherObject)
EffectMapping

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

(Zděděno od Effect)
HasAnimatedProperties

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

(Zděděno od Animatable)
IsFrozen

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

(Zděděno od Freezable)
IsSealed

Získá hodnotu, která označuje, zda je tato instance aktuálně 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 použití pro efekt.

Metody

Name Description
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Použije pro AnimationClock zadaný DependencyPropertyparametr . Pokud je vlastnost již animovaná, použije se zadané HandoffBehavior .

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

Použije pro AnimationClock zadaný DependencyPropertyparametr . Pokud je vlastnost již animované, použije se SnapshotAndReplace chování předání.

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

Použije animaci na zadanou DependencyPropertypoložku . 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)
BeginAnimation(DependencyProperty, AnimationTimeline)

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

(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á se má vymazat, je určena identifikátorem DependencyProperty .

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

Vymaže místní hodnotu vlastnosti jen pro čtení. Vlastnost, která má být vymazána, 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é se už nemusí přeložit), ale ne animace nebo jejich aktuální hodnoty.

CloneCore(Freezable)

Vytvoří instanci klonem (hloubkovou kopií) 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 jejich aktuální hodnoty se zkopírují.

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 dosahuje vyvoláním jakékoli CoerceValueCallback funkce zadané v metadatech vlastností pro vlastnost závislosti, protože existuje ve volání DependencyObject.

(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 je poskytnutá DependencyObject hodnota ekvivalentní aktuálnímu DependencyObject.

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

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

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

Znepřístupňuje tento Animatable objekt nebo určuje, zda jej lze upravit.

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

Vrátí ne animovanou hodnotu zadané DependencyPropertyhodnoty .

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

Vytvoří zablokovanou kopii Freezablevlastnosti , pomocí základních (ne animovaných) hodnot vlastností. Vzhledem k tomu, že je kopie zablokovaná, všechny ukotvené dílčí objekty se zkopírují odkazem.

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

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

GetCurrentValueAsFrozen()

Vytvoří ukotvenou kopii s použitím aktuálních Freezable hodnot vlastností. Vzhledem k tomu, že je kopie zablokovaná, všechny ukotvené dílčí objekty se zkopírují odkazem.

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

Vytvoří aktuální instanci zmrazený klon zadaného Freezable. Pokud má objekt animované vlastnosti závislostí, jejich aktuální animované hodnoty se zkopírují.

GetHashCode()

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

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

Vytvoří specializovaný enumerátor pro určení, které vlastnosti závislosti mají místně nastavené hodnoty na tomto DependencyObject.

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

Získá Type 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 Object.

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

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

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

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

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

Zajišťuje, aby byly pro datový člen, který byl právě nastaven, vytvořeny DependencyObjectType příslušné kontextové ukazatele.

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

Přepíše implementaci DependencyObjectOnPropertyChanged(DependencyPropertyChangedEventArgs) také vyvolat všechny Changed obslužné rutiny v reakci na měnící se závislost vlastnost typu Freezable.

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

Přidruží hodnotu vlastnosti závislosti k konstantnímu registru float pixelového shaderu.

PixelShaderSamplerCallback(Int32, SamplingMode)

Přidruží hodnotu vlastnosti závislosti k registru vzorkovníku pixelového shaderu a SamplingModeregistru .

PixelShaderSamplerCallback(Int32)

Přidruží hodnotu vlastnosti závislosti k registru vzorkovníku pixelového shaderu.

ReadLocalValue(DependencyProperty)

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

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

Zajišťuje, že se k němu Freezable přistupuje z platného vlákna. Dědiče Freezable této metody musí volat tuto metodu na začátku jakéhokoli rozhraní API, které čte datové členy, které nejsou vlastnostmi závislosti.

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

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

RegisterPixelShaderSamplerProperty(String, Type, Int32)

Přidruží vlastnost závislosti k registru sampleru shaderu.

SetCurrentValue(DependencyProperty, Object)

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

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

Nastaví místní hodnotu vlastnosti závislosti určenou jeho 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 identifikátorem DependencyPropertyKey vlastnosti závislosti.

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

Vrátí hodnotu, která určuje, zda procesy serializace 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í efekt, ž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 událost Freezable a vyvolá její OnChanged() metodu. Třídy odvozené z Freezable by měly volat tuto metodu 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 není zablokovaný a že k němu přistupujete z platného kontextu podprocesu. Freezable dědiče by měly tuto metodu volat na začátku jakéhokoli rozhraní API, které zapisuje do datových členů, které nejsou vlastnostmi závislosti.

(Zděděno od Freezable)

Událost

Name Description
Changed

Nastane, když Freezable je objekt, který obsahuje, změněn.

(Zděděno od Freezable)

Platí pro

Viz také