Share via


ShaderEffect Kelas

Definisi

Memberikan efek bitmap kustom dengan menggunakan 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
Warisan

Contoh

Contoh kode berikut menunjukkan cara memperoleh dari ShaderEffect kelas .

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

Contoh kode berikut menunjukkan shader yang sesuai dengan kelas sebelumnya ShaderEffect .

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

XAML berikut menunjukkan cara menggunakan efek shader kustom.

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

Keterangan

Berasal dari ShaderEffect kelas untuk menerapkan efek kustom berdasarkan shader piksel tunggal.

Langkah-langkah berikut menunjukkan cara membuat efek kustom.

  1. PixelShader Muat dari bytecode High Level Shading Language (HLSL) yang telah dikompilasi sebelumnya.

  2. Tentukan properti dependensi yang mewakili parameter efek dan Brushinput permukaan berbasis. Gunakan salah RegisterPixelShaderSamplerProperty satu kelebihan beban untuk mengaitkan input ini dengan nomor register yang dirujuk dalam bytecode HLSL.

Jumlah sampel dibatasi hingga 4.

Pembatasan berikut berlaku saat menggunakan shader PS 3.0.

  • Ketika shader PS 3.0 ditetapkan, jumlah sampler meningkat menjadi 8. Tetapkan shader PS 3.0 sebelum shader lain untuk mengaktifkan pendaftaran 8 sampler.

  • Batas register konstanta shader penuh 224 untuk float digunakan. Untuk informasi selengkapnya, lihat ps_3_0.

  • Jenis data berikut ini hanya didukung dalam shader PS 3.0. Pengecualian dilemparkan jika ini digunakan dalam versi shader yang lebih rendah.

    • int dan jenis yang dapat dikonversi ke int: uint, byte, sbyte, long, ulong, short, ushort, char

    • bool

  • Jika shader PS 3.0 yang valid dimuat di komputer yang tidak memiliki dukungan perangkat keras untuk PS 3.0, shader diabaikan. Jika shader tidak valid, tidak ada pengecualian yang dilemparkan.

  • Jika komputer memiliki lebih dari satu kartu video, perilaku ditentukan oleh kartu video yang paling tidak mampu. Misalnya, jika komputer memiliki dua kartu video, salah satunya mendukung PS 3.0 dan salah satunya tidak, perilakunya sama seperti jika komputer tidak mendukung PS 3.0.

  • Jika komputer mendukung penyajian PS 3.0 dalam perangkat keras, tetapi shader PS 3.0 yang tidak valid ditetapkan, InvalidPixelShaderEncountered peristiwa akan dinaikkan. Contoh shader PS 3.0 yang tidak valid adalah yang dikompilasi dengan ps_3_sw bendera . Kelas ShaderEffect hanya menerima shader PS 3.0 yang dikompilasi dengan bendera yang ps_3_0 diteruskan ke fxc.exe. Untuk informasi selengkapnya, lihat Alat Pengkompilasi Efek.

Catatan

Shader PS 2.0 berjalan saat merender dalam perangkat lunak. Namun, bahkan jika PS 3.0 didukung oleh perangkat keras sistem, shader PS 3.0 tidak berjalan selama penyajian perangkat lunak.

Konstruktor

ShaderEffect()

Menginisialisasi instans baru kelas ShaderEffect.

Bidang

PixelShaderProperty

PixelShader Mengidentifikasi properti dependensi.

Properti

CanFreeze

Mendapatkan nilai yang menunjukkan apakah objek dapat dibuat tidak dapat dimodifikasi.

(Diperoleh dari Freezable)
DdxUvDdyUvRegisterIndex

Mendapatkan atau menetapkan nilai yang menunjukkan register shader untuk digunakan untuk turunan parsial dari koordinat tekstur sehubungan dengan ruang layar.

DependencyObjectType

Mendapatkan yang membungkus jenis CLR instans DependencyObjectType ini.

(Diperoleh dari DependencyObject)
Dispatcher

Mendapatkan ini DispatcherDispatcherObject dikaitkan dengan.

(Diperoleh dari DispatcherObject)
EffectMapping

Ketika ditimpa di kelas turunan, mengubah input mouse dan mengoordinasikan sistem melalui efek .

(Diperoleh dari Effect)
HasAnimatedProperties

Mendapatkan nilai yang menunjukkan apakah satu atau beberapa AnimationClock objek dikaitkan dengan salah satu properti dependensi objek ini.

(Diperoleh dari Animatable)
IsFrozen

Mendapatkan nilai yang menunjukkan apakah objek saat ini dapat dimodifikasi.

(Diperoleh dari Freezable)
IsSealed

Mendapatkan nilai yang menunjukkan apakah instans ini saat ini disegel (baca-saja).

(Diperoleh dari DependencyObject)
PaddingBottom

Mendapatkan atau mengatur nilai yang menunjukkan bahwa tekstur output efek lebih besar dari tekstur inputnya di sepanjang tepi bawah.

PaddingLeft

Mendapatkan atau menetapkan nilai yang menunjukkan bahwa tekstur output efek lebih besar dari tekstur inputnya di sepanjang tepi kiri.

PaddingRight

Mendapatkan atau menetapkan nilai yang menunjukkan bahwa tekstur output efek lebih besar dari tekstur inputnya di sepanjang tepi kanan.

PaddingTop

Mendapatkan atau mengatur nilai yang menunjukkan bahwa tekstur output efek lebih besar dari tekstur inputnya di sepanjang tepi atas.

PixelShader

Mendapatkan atau mengatur PixelShader untuk digunakan untuk efek.

Metode

ApplyAnimationClock(DependencyProperty, AnimationClock)

AnimationClock Menerapkan ke yang ditentukanDependencyProperty. Jika properti sudah dianimasikan, SnapshotAndReplace perilaku handoff digunakan.

(Diperoleh dari Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

AnimationClock Menerapkan ke yang ditentukanDependencyProperty. Jika properti sudah dianimasikan, properti yang ditentukan HandoffBehavior akan digunakan.

(Diperoleh dari Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Menerapkan animasi ke yang ditentukan DependencyProperty. Animasi dimulai ketika bingkai berikutnya dirender. Jika properti yang ditentukan sudah dianimasikan, SnapshotAndReplace perilaku handoff digunakan.

(Diperoleh dari Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Menerapkan animasi ke yang ditentukan DependencyProperty. Animasi dimulai ketika bingkai berikutnya dirender. Jika properti yang ditentukan sudah dianimasikan, properti yang ditentukan HandoffBehavior akan digunakan.

(Diperoleh dari Animatable)
CheckAccess()

Menentukan apakah utas panggilan memiliki akses ke ini DispatcherObject.

(Diperoleh dari DispatcherObject)
ClearValue(DependencyProperty)

Menghapus nilai lokal properti. Properti yang akan dibersihkan ditentukan oleh DependencyProperty pengidentifikasi.

(Diperoleh dari DependencyObject)
ClearValue(DependencyPropertyKey)

Menghapus nilai lokal properti baca-saja. Properti yang akan dibersihkan ditentukan oleh DependencyPropertyKey.

(Diperoleh dari DependencyObject)
Clone()

Membuat klon objek ini ShaderEffect yang dapat dimodifikasi, membuat salinan mendalam dari nilai objek ini. Saat menyalin properti dependensi objek ini, metode ini menyalin referensi sumber daya dan pengikatan data (yang mungkin tidak lagi diselesaikan), tetapi bukan animasi atau nilainya saat ini.

CloneCore(Freezable)

Menjadikan instans sebagai kloning (salinan mendalam) dari yang ditentukan Freezable menggunakan nilai properti dasar (non-animasi).

CloneCurrentValue()

Membuat klon objek ini ShaderEffect yang dapat dimodifikasi, membuat salinan mendalam dari nilai objek ini saat ini. Referensi sumber daya, pengikatan data, dan animasi tidak disalin, tetapi nilainya saat ini disalin.

CloneCurrentValueCore(Freezable)

Menjadikan instans sebagai kloning yang dapat dimodifikasi (salinan mendalam) dari yang ditentukan Freezable menggunakan nilai properti saat ini.

CoerceValue(DependencyProperty)

Memaksakan nilai properti dependensi yang ditentukan. Ini dicapai dengan memanggil fungsi apa pun CoerceValueCallback yang ditentukan dalam metadata properti untuk properti dependensi seperti yang ada pada panggilan DependencyObject.

(Diperoleh dari DependencyObject)
CreateInstance()

Menginisialisasi instans baru kelas Freezable.

(Diperoleh dari Freezable)
CreateInstanceCore()

Membuat instans baru dari kelas turunan Freezable .

Equals(Object)

Menentukan apakah yang disediakan DependencyObject setara dengan saat ini DependencyObject.

(Diperoleh dari DependencyObject)
Freeze()

Membuat objek saat ini tidak dapat dimodifikasi dan mengatur propertinya IsFrozen ke true.

(Diperoleh dari Freezable)
FreezeCore(Boolean)

Membuat objek ini Animatable tidak dapat dimodifikasi atau menentukan apakah objek dapat dibuat tidak dapat dimodifikasi.

(Diperoleh dari Animatable)
GetAnimationBaseValue(DependencyProperty)

Mengembalikan nilai non-animasi dari yang ditentukan DependencyProperty.

(Diperoleh dari Animatable)
GetAsFrozen()

Membuat salinan beku dari Freezable, menggunakan nilai properti dasar (non-animasi). Karena salinan dibekukan, sub-objek yang dibekukan disalin oleh referensi.

(Diperoleh dari Freezable)
GetAsFrozenCore(Freezable)

Membuat instans menjadi kloning beku dari yang ditentukan Freezable menggunakan nilai properti dasar (non-animasi).

GetCurrentValueAsFrozen()

Membuat salinan beku dari Freezable menggunakan nilai properti saat ini. Karena salinan dibekukan, sub-objek yang dibekukan disalin oleh referensi.

(Diperoleh dari Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Menjadikan instans saat ini sebagai klon beku dari klon yang ditentukan Freezable. Jika objek memiliki properti dependensi animasi, nilai animasinya saat ini akan disalin.

GetHashCode()

Mendapatkan kode hash untuk ini DependencyObject.

(Diperoleh dari DependencyObject)
GetLocalValueEnumerator()

Membuat enumerator khusus untuk menentukan properti dependensi mana yang telah mengatur nilai secara lokal pada ini DependencyObject.

(Diperoleh dari DependencyObject)
GetType()

Mendapatkan instans Type saat ini.

(Diperoleh dari Object)
GetValue(DependencyProperty)

Mengembalikan nilai efektif properti dependensi saat ini pada instans ini dari DependencyObject.

(Diperoleh dari DependencyObject)
InvalidateProperty(DependencyProperty)

Mengevaluasi ulang nilai efektif untuk properti dependensi yang ditentukan.

(Diperoleh dari DependencyObject)
MemberwiseClone()

Membuat salinan dangkal dari yang saat ini Object.

(Diperoleh dari Object)
OnChanged()

Dipanggil ketika objek saat ini Freezable dimodifikasi.

(Diperoleh dari Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Memastikan bahwa penunjuk konteks yang sesuai ditetapkan untuk DependencyObjectType anggota data yang baru saja ditetapkan.

(Diperoleh dari Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Anggota ini mendukung infrastruktur Windows Presentation Foundation (WPF) dan tidak dimaksudkan untuk digunakan langsung dari kode Anda.

(Diperoleh dari Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Mengambil alih DependencyObject implementasi OnPropertyChanged(DependencyPropertyChangedEventArgs) untuk juga memanggil handler apa pun Changed sebagai respons terhadap properti dependensi yang berubah dari jenis Freezable.

(Diperoleh dari Freezable)
PixelShaderConstantCallback(Int32)

Mengaitkan nilai properti dependensi dengan register konstanta float piksel shader.

PixelShaderSamplerCallback(Int32)

Mengaitkan nilai properti dependensi dengan register sampler pixel shader.

PixelShaderSamplerCallback(Int32, SamplingMode)

Mengaitkan nilai properti dependensi dengan register sampler pixel shader dan SamplingMode.

ReadLocalValue(DependencyProperty)

Mengembalikan nilai lokal properti dependensi, jika ada.

(Diperoleh dari DependencyObject)
ReadPreamble()

Memastikan bahwa Freezable sedang diakses dari utas yang valid. Pewaris Freezable harus memanggil metode ini di awal API apa pun yang membaca anggota data yang bukan properti dependensi.

(Diperoleh dari Freezable)
RegisterPixelShaderSamplerProperty(String, Type, Int32)

Mengaitkan properti dependensi dengan register shader sampler.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Mengaitkan properti dependensi dengan register shader sampler dan SamplingMode.

SetCurrentValue(DependencyProperty, Object)

Mengatur nilai properti dependensi tanpa mengubah sumber nilainya.

(Diperoleh dari DependencyObject)
SetValue(DependencyProperty, Object)

Mengatur nilai lokal properti dependensi, yang ditentukan oleh pengidentifikasi properti dependensinya.

(Diperoleh dari DependencyObject)
SetValue(DependencyPropertyKey, Object)

Mengatur nilai lokal properti dependensi baca-saja, yang ditentukan oleh DependencyPropertyKey pengidentifikasi properti dependensi.

(Diperoleh dari DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Mengembalikan nilai yang menunjukkan apakah proses serialisasi harus membuat serialisasi nilai untuk properti dependensi yang disediakan.

(Diperoleh dari DependencyObject)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)
UpdateShaderValue(DependencyProperty)

Memberi tahu efek bahwa konstanta shader atau sampler yang sesuai dengan properti dependensi yang ditentukan harus diperbarui.

VerifyAccess()

Memberlakukan bahwa utas panggilan memiliki akses ke ini DispatcherObject.

(Diperoleh dari DispatcherObject)
WritePostscript()

Menaikkan Changed peristiwa untuk Freezable dan memanggil metodenya OnChanged() . Kelas yang berasal dari Freezable harus memanggil metode ini di akhir API apa pun yang memodifikasi anggota kelas yang tidak disimpan sebagai properti dependensi.

(Diperoleh dari Freezable)
WritePreamble()

Memverifikasi bahwa Freezable tidak dibekukan dan diakses dari konteks utas yang valid. Freezable pewaris harus memanggil metode ini di awal API apa pun yang menulis ke anggota data yang bukan properti dependensi.

(Diperoleh dari Freezable)

Acara

Changed

Terjadi ketika Freezable atau objek yang dikandungnya dimodifikasi.

(Diperoleh dari Freezable)

Berlaku untuk

Lihat juga