WPF Effect: Creating A Custom Effect
Beberapa tutorial berbahasa Inggris tentang WPF Effect yang saya lihat, tidak menampilkan bagaimana langkah-langkah yang cukup jelas untuk membuat Custom Effect. Akhirnya saya mencoba-coba mengutak-atik sana sini di Visual C# 2008 Express Edition saya dan berhasil membuat sebuah Effect yang sederhana. Di sini saya akan mencoba berbagi bagaimana caranya…
Bersiap…
Pertama-tama harus diinstall beberapa tool yang dibutuhkan untuk membuat Custom Effect, yaitu:
Selain itu, dibutuhkan pengetahuan membuat pixel shader dalam bahasa HLSL yang akan coba saya bahas sedikit nantinya (jika ada waktu :p).
Mulai…!
Custom Effect yang akan kita buat kali ini adalah Grayscale Effect.
==>
MEMBUAT SHADER
- Buka notepad (atau editor kesayangan Anda yang lain)
- Ketikkan kode program shader berikut:
sampler2D implicitInput : register(s0); float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 color = tex2D(implicitInput, uv.xy);
float4 newcolor;
newcolor = (color.r + color.g + color.b) * 0.33333333;
newcolor.a = color.a;
return newcolor;
}
NB: kode program shader di atas bekerja untuk setiap pixel. newcolor di-set menjadi campuran warna rgb yang intensitasnya dibagi rata 1/3.
- Simpan dengan nama file Grayscale.fx (ingat: gunakan encoding ANSI, jangan unicode, compiler shader dari DirectX hanya bisa mengkompilasi kode dengan encoding ANSI)
- Buka DirextX SDK Command Prompt, pindahkan CWD (Current Working Directory) ke tempat penyimpanan file .fx sebelumnya.
- Ketikkan
fxc /T ps_2_0 /E main /Fo Grayscale.ps Grayscale.fx
untuk mengkompilasi file .fx yang telah dibuat dan meng-output kan hasilnya ke Grayscale.ps.
MEMBUAT PEMBUNGKUS EFFECT DI C#
- Buat project baru di Visual C# 2008, File –> New Project, pilih template Class Library. Beri nama GrayscaleEffect.
- Rename dokumen Class1.cs menjadi GrayscaleEffect.cs.
- Tambahkan file .ps yang telah dikompilasi ke dalam project
- Set Property “Build Action” pada file .ps yang telah ditambahkan menjadi Resource
- Tambahkan References “WindowsBase”, “PresentationCore”, dan “PresentationFramework”
- Ketikkan kode berikut dalam file Grayscale.cs
- using System;
- using System.Windows;
- using System.Windows.Media;
- using System.Windows.Media.Effects;
-
- namespace GrayscaleEffect
- {
- public class GrayscaleEffect : ShaderEffect
- {
- public GrayscaleEffect()
- {
- PixelShader =
- new PixelShader()
- {
- UriSource = new Uri("pack://application:,,,/GrayscaleEffect;component/Grayscale.ps")
- };
- UpdateShaderValue(InputProperty);
- }
-
- public Brush Input
- {
- get { return (Brush)GetValue(InputProperty); }
- set { SetValue(InputProperty, value); }
- }
-
- public static DependencyProperty InputProperty =
- ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(GrayscaleEffect), 0);
- }
- }
-
Sedikit penjelasan: Kode di atas membuat kelas GrayscaleEffect yang merupakan turunan dari kelas ShaderEffect. Dalam konstruktornya, property PixelShader di-set dengan shader dari file .ps hasil kompilasi fxc sebelumnya. Property Input dan InputProperty (DependencyProperty-nya) dari kelas ini merupakan “penghubung” dengan implicitInput dalam kode program shader sebelumnya.
- Build project dengan menekan F6
MEMBUAT APLIKASI WPF YANG MENGGUNAKAN EFFECT YANG TELAH DIBUAT
- Tambahkan project baru ke dalam solution, Klik kanan solution –> Add –> New Project.
Karena project library GrayscaleEffect tadi belum disimpan, maka VS akan menanyakan tempat penyimpanan. Pilih directory yang diinginkan, simpan, dan lanjutkan membuat project baru. - Pilih template WPF Application, beri nama GrayscaleTest.
- Tambahkan Reference GrayscaleEffect pada project, Klik kanan pada References GrayscaleTest –> Add Reference –> Tab Projects –> GrayscaleEffect –> OK
- Tambahkan namespace dalam kode XAML untuk library GrayscaleEffect yang telah dibuat.
- xmlns:fx="clr-namespace:GrayscaleEffect;assembly=GrayscaleEffect"
- Tambahkan sebuah image dari file gambar ke dalam Grid yang telah ada secara default. Kemudian tambahkan property Grid.Effect sebagai berikut:
- <Grid.Effect>
- <fx:GrayscaleEffect />
- </Grid.Effect>
- Kode XAML keseluruhannya akan mirip seperti berikut:
- <Window x:Class="GrayscaleTest.Window1"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:fx="clr-namespace:GrayscaleEffect;assembly=GrayscaleEffect"
- Title="Window1" Height="300" Width="300">
- <Grid>
- <Grid.Effect>
- <fx:GrayscaleEffect />
- </Grid.Effect>
- <Image Margin="12,12,66,100" Name="image1" Stretch="Fill" Source="nature.jpg" />
- </Grid>
- </Window>
-
- Set GrayscaleTest sebagai StartupProject
- Jalankan dengan menekan tombol F5. Lihat Image berubah warna menjadi grayscale.
Demikian tutorial membuat GrayscaleEffect. Pada postingan selanjutnya, saya akan membahas bagaimana menganimasikan GrayscaleEffect ini menjadi seperti background Windows XP yang menjadi grayscale saat akan di shutdown.