ShaderEffect Klasa

Definicja

Zapewnia niestandardowy efekt mapy bitowej przy użyciu elementu 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
Dziedziczenie

Przykłady

Poniższy przykład kodu pokazuje, jak pochodzić z ShaderEffect klasy .

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

Poniższy przykład kodu przedstawia moduł cieniujący odpowiadający poprzedniej ShaderEffect klasie.

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

Poniższy kod XAML pokazuje, jak używać niestandardowego efektu cieniowania.

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

Uwagi

Wyczerpuj ShaderEffect się od klasy, aby zaimplementować efekt niestandardowy na podstawie cieniowania pojedynczego piksela.

W poniższych krokach pokazano, jak utworzyć efekt niestandardowy.

  1. Załaduj kod bajtowy PixelShader ze wstępnie skompilowanego języka cieniowania wysokiego poziomu (HLSL).

  2. Zdefiniuj właściwości zależności, które reprezentują parametry efektu i Brushdanych wejściowych powierzchni opartych na platformie . Użyj jednego z RegisterPixelShaderSamplerProperty przeciążeń, aby skojarzyć te dane wejściowe z numerami rejestru, do których odwołuje się kod bajtowy HLSL.

Liczba próbek jest ograniczona do 4.

W przypadku korzystania z cieniowania PS 3.0 obowiązują następujące ograniczenia.

  • Po przypisaniu cieniowania PS 3.0 liczba próbek zwiększa się do 8. Przypisz moduł cieniowania PS 3.0 przed innymi modułami cieniowania, aby włączyć rejestrowanie 8 próbek.

  • Używany jest limit stałego rejestru pełnego cieniowania 224 dla zmiennoprzecinków. Aby uzyskać więcej informacji, zobacz ps_3_0.

  • Następujące typy danych są obsługiwane tylko w cieniowaniach PS 3.0. Wyjątek jest zgłaszany, jeśli są one używane w niższych wersjach cieniowania.

    • inti typy konwertowane na int: uint, , byte, ulongsbytelongshort, ushortchar

    • bool

  • Jeśli prawidłowy cieniator PS 3.0 jest ładowany na komputerze, który nie ma obsługi sprzętu dla ps 3.0, cieniator jest ignorowany. Jeśli cieniator jest nieprawidłowy, nie zostanie zgłoszony żaden wyjątek.

  • Jeśli komputer ma więcej niż jedną kartę wideo, zachowanie jest definiowane przez najmniej zdolną kartę wideo. Jeśli na przykład komputer ma dwie karty wideo, z których jedna obsługuje program PS 3.0 i jeden z nich nie, zachowanie jest takie samo, jak w przypadku, gdy komputer nie obsługuje programu PS 3.0.

  • Jeśli komputer obsługuje renderowanie programu PS 3.0 w sprzęcie, ale przypisany jest nieprawidłowy moduł cieniowania PS 3.0, InvalidPixelShaderEncountered zostanie zgłoszone zdarzenie. Przykładem nieprawidłowego cieniowania ps 3.0 jest jeden skompilowany z flagą ps_3_sw . Klasa ShaderEffect akceptuje tylko cieniowanie ps 3.0 skompilowane z flagą przekazaną ps_3_0 do fxc.exe. Aby uzyskać więcej informacji, zobacz Effect-Compiler Tool (Narzędzie kompilatora efektu).

Uwaga

Moduły cieniowania PS 2.0 są uruchamiane podczas renderowania w oprogramowaniu. Jednak nawet jeśli program PS 3.0 jest obsługiwany przez sprzęt systemu, cieniowania PS 3.0 nie są uruchamiane podczas renderowania oprogramowania.

Konstruktory

ShaderEffect()

Inicjuje nowe wystąpienie klasy ShaderEffect.

Pola

PixelShaderProperty

PixelShader Identyfikuje właściwość zależności.

Właściwości

CanFreeze

Pobiera wartość wskazującą, czy obiekt może być niemodyfikowalny.

(Odziedziczone po Freezable)
DdxUvDdyUvRegisterIndex

Pobiera lub ustawia wartość, która wskazuje rejestr cieniowania do użycia dla częściowych pochodnych współrzędnych tekstury w odniesieniu do przestrzeni ekranu.

DependencyObjectType

Pobiera klasę DependencyObjectType , która opakowuje typ CLR tego wystąpienia.

(Odziedziczone po DependencyObject)
Dispatcher

Pobiera element, z Dispatcher który DispatcherObject jest skojarzony.

(Odziedziczone po DispatcherObject)
EffectMapping

Po przesłonięciu w klasie pochodnej dane wejściowe myszy i układy współrzędnych są przekształcane przez efekt.

(Odziedziczone po Effect)
HasAnimatedProperties

Pobiera wartość wskazującą, czy co najmniej jeden AnimationClock obiekt jest skojarzony z dowolnymi właściwościami zależności tego obiektu.

(Odziedziczone po Animatable)
IsFrozen

Pobiera wartość wskazującą, czy obiekt jest obecnie modyfikowalny.

(Odziedziczone po Freezable)
IsSealed

Pobiera wartość wskazującą, czy to wystąpienie jest obecnie zapieczętowane (tylko do odczytu).

(Odziedziczone po DependencyObject)
PaddingBottom

Pobiera lub ustawia wartość wskazującą, że tekstura wyjściowa efektu jest większa niż tekstura wejściowa wzdłuż dolnej krawędzi.

PaddingLeft

Pobiera lub ustawia wartość wskazującą, że tekstura wyjściowa efektu jest większa niż tekstura wejściowa wzdłuż lewej krawędzi.

PaddingRight

Pobiera lub ustawia wartość wskazującą, że tekstura wyjściowa efektu jest większa niż tekstura wejściowa wzdłuż prawej krawędzi.

PaddingTop

Pobiera lub ustawia wartość wskazującą, że tekstura wyjściowa efektu jest większa niż tekstura wejściowa wzdłuż górnej krawędzi.

PixelShader

Pobiera lub ustawia PixelShader element do użycia dla efektu.

Metody

ApplyAnimationClock(DependencyProperty, AnimationClock)

Stosuje element AnimationClock do określonego DependencyPropertyelementu . Jeśli właściwość jest już animowana, SnapshotAndReplace używane jest zachowanie przekazywania.

(Odziedziczone po Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Stosuje element AnimationClock do określonego DependencyPropertyelementu . Jeśli właściwość jest już animowana, zostanie użyta określona HandoffBehavior wartość .

(Odziedziczone po Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Stosuje animację do określonego DependencyPropertyelementu . Animacja jest uruchamiana po renderowaniu następnej ramki. Jeśli określona właściwość jest już animowana, SnapshotAndReplace używane jest zachowanie przekazywania.

(Odziedziczone po Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Stosuje animację do określonego DependencyPropertyelementu . Animacja jest uruchamiana po renderowaniu następnej ramki. Jeśli określona właściwość jest już animowana, zostanie użyta określona HandoffBehavior właściwość.

(Odziedziczone po Animatable)
CheckAccess()

Określa, czy wątek wywołujący ma dostęp do tego DispatcherObjectelementu .

(Odziedziczone po DispatcherObject)
ClearValue(DependencyProperty)

Czyści wartość lokalną właściwości. Właściwość do wyczyszczenia jest określana przez DependencyProperty identyfikator.

(Odziedziczone po DependencyObject)
ClearValue(DependencyPropertyKey)

Czyści wartość lokalną właściwości tylko do odczytu. Właściwość do wyczyszczenia jest określana przez element DependencyPropertyKey.

(Odziedziczone po DependencyObject)
Clone()

Tworzy modyfikowalny klon tego ShaderEffect obiektu, tworząc głębokie kopie wartości tego obiektu. Podczas kopiowania właściwości zależności tego obiektu ta metoda kopiuje odwołania do zasobów i powiązania danych (które mogą nie być już rozpoznawane), ale nie animacje ani ich bieżące wartości.

CloneCore(Freezable)

Sprawia, że wystąpienie jest klonem (kopia głęboka) określonego Freezable obiektu przy użyciu wartości właściwości base (nieimowane).

CloneCurrentValue()

Tworzy modyfikowalny klon tego ShaderEffect obiektu, tworząc głębokie kopie bieżących wartości tego obiektu. Odwołania do zasobów, powiązania danych i animacje nie są kopiowane, ale ich bieżące wartości są kopiowane.

CloneCurrentValueCore(Freezable)

Sprawia, że wystąpienie jest modyfikowalnym klonem (kopia głęboka) określonego Freezable przy użyciu bieżących wartości właściwości.

CoerceValue(DependencyProperty)

Przekształca wartość określonej właściwości zależności. Jest to realizowane przez wywołanie dowolnej CoerceValueCallback funkcji określonej w metadanych właściwości dla właściwości zależności, ponieważ istnieje w wywołaniu DependencyObject.

(Odziedziczone po DependencyObject)
CreateInstance()

Inicjuje nowe wystąpienie klasy Freezable.

(Odziedziczone po Freezable)
CreateInstanceCore()

Tworzy nowe wystąpienie klasy pochodnej Freezable .

Equals(Object)

Określa, czy podany DependencyObject element jest odpowiednikiem bieżącego DependencyObjectelementu .

(Odziedziczone po DependencyObject)
Freeze()

Sprawia, że bieżący obiekt jest niemodyfikowalny i ustawia jego IsFrozen właściwość na true.

(Odziedziczone po Freezable)
FreezeCore(Boolean)

Sprawia, że ten Animatable obiekt jest niemodyfikowalny lub określa, czy można go zmodyfikować.

(Odziedziczone po Animatable)
GetAnimationBaseValue(DependencyProperty)

Zwraca nieimętowaną wartość określonego DependencyPropertyelementu .

(Odziedziczone po Animatable)
GetAsFrozen()

Tworzy zamrożoną kopię Freezableobiektu przy użyciu podstawowych (nieimowanych) wartości właściwości. Ponieważ kopia jest zamrożona, wszystkie zamrożone obiekty podrzędne są kopiowane przez odwołanie.

(Odziedziczone po Freezable)
GetAsFrozenCore(Freezable)

Sprawia, że wystąpienie jest zamrożonym klonem określonego Freezable przy użyciu wartości właściwości base (nieimowane).

GetCurrentValueAsFrozen()

Tworzy zamrożoną kopię przy użyciu bieżących Freezable wartości właściwości. Ponieważ kopia jest zamrożona, wszystkie zamrożone obiekty podrzędne są kopiowane przez odwołanie.

(Odziedziczone po Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Powoduje, że bieżące wystąpienie jest zamrożonym klonem określonego Freezableelementu . Jeśli obiekt ma animowane właściwości zależności, zostaną skopiowane bieżące animowane wartości.

GetHashCode()

Pobiera kod skrótu dla tego DependencyObjectpliku .

(Odziedziczone po DependencyObject)
GetLocalValueEnumerator()

Tworzy wyspecjalizowany moduł wyliczający do określania, które właściwości zależności mają lokalnie ustawione wartości dla tego DependencyObjectelementu .

(Odziedziczone po DependencyObject)
GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
GetValue(DependencyProperty)

Zwraca bieżącą obowiązującą wartość właściwości zależności dla tego wystąpienia klasy DependencyObject.

(Odziedziczone po DependencyObject)
InvalidateProperty(DependencyProperty)

Ponownie oblicza efektywną wartość dla określonej właściwości zależności.

(Odziedziczone po DependencyObject)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
OnChanged()

Wywoływana, gdy bieżący Freezable obiekt jest modyfikowany.

(Odziedziczone po Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Zapewnia, że dla elementu członkowskiego danych, który właśnie został ustawiony, są ustanawiane DependencyObjectType odpowiednie wskaźniki kontekstu.

(Odziedziczone po Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Ten element członkowski obsługuje infrastrukturę Windows Presentation Foundation (WPF) i nie jest przeznaczony do użycia bezpośrednio z kodu.

(Odziedziczone po Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Zastępuje implementację DependencyObject elementu OnPropertyChanged(DependencyPropertyChangedEventArgs) , aby również wywoływać wszelkie Changed procedury obsługi w odpowiedzi na zmieniającą się właściwość zależności typu Freezable.

(Odziedziczone po Freezable)
PixelShaderConstantCallback(Int32)

Kojarzy wartość właściwości zależności z zmiennoprzecinkowym rejestrem zmiennoprzecinkowym cieniatora pikseli.

PixelShaderSamplerCallback(Int32)

Kojarzy wartość właściwości zależności z rejestrem próbkatora cieniowania pikseli.

PixelShaderSamplerCallback(Int32, SamplingMode)

Kojarzy wartość właściwości zależności z rejestrem modułu cieniowania pikseli i .SamplingMode

ReadLocalValue(DependencyProperty)

Zwraca wartość lokalną właściwości zależności, jeśli istnieje.

(Odziedziczone po DependencyObject)
ReadPreamble()

Zapewnia dostęp do obiektu Freezable z prawidłowego wątku. Dziedziczenie Freezable elementu musi wywoływać tę metodę na początku dowolnego interfejsu API, który odczytuje elementy członkowskie danych, które nie są właściwościami zależności.

(Odziedziczone po Freezable)
RegisterPixelShaderSamplerProperty(String, Type, Int32)

Kojarzy właściwość zależności z rejestrem przykładatora cieniowania.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Kojarzy właściwość zależności z rejestrem przykładatora cieniowania i .SamplingMode

SetCurrentValue(DependencyProperty, Object)

Ustawia wartość właściwości zależności bez zmieniania jej źródła wartości.

(Odziedziczone po DependencyObject)
SetValue(DependencyProperty, Object)

Ustawia wartość lokalną właściwości zależności określonej przez jej identyfikator właściwości zależności.

(Odziedziczone po DependencyObject)
SetValue(DependencyPropertyKey, Object)

Ustawia wartość lokalną właściwości zależności tylko do odczytu określonej przez DependencyPropertyKey identyfikator właściwości zależności.

(Odziedziczone po DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Zwraca wartość wskazującą, czy procesy serializacji powinny serializować wartość dla podanej właściwości zależności.

(Odziedziczone po DependencyObject)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)
UpdateShaderValue(DependencyProperty)

Powiadamia efekt, że należy zaktualizować stałą cieniowania lub próbkatora odpowiadającą określonej właściwości zależności.

VerifyAccess()

Wymusza, że wątek wywołujący ma dostęp do tego DispatcherObjectelementu .

(Odziedziczone po DispatcherObject)
WritePostscript()

Changed Wywołuje zdarzenie dla klasy Freezable i wywołuje jego OnChanged() metodę. Klasy pochodzące z Freezable klasy powinny wywoływać tę metodę na końcu dowolnego interfejsu API, który modyfikuje składowe klasy, które nie są przechowywane jako właściwości zależności.

(Odziedziczone po Freezable)
WritePreamble()

Sprawdza, czy element Freezable nie jest zamrożony i czy jest on uzyskiwany z prawidłowego kontekstu wątkowego. Freezable dziedziczenie powinno wywoływać tę metodę na początku dowolnego interfejsu API, który zapisuje dane członkom, które nie są właściwościami zależności.

(Odziedziczone po Freezable)

Zdarzenia

Changed

Występuje, gdy Freezable obiekt lub, który zawiera, jest modyfikowany.

(Odziedziczone po Freezable)

Dotyczy

Zobacz też