PDC 2008, Day #4, Session #4, 1 hr 15 mins
My final session at PDC 2008 was a talk about the improvements in WPF graphics that are available in .NET Framework 3.5 SP1. David also touched briefly some possible future features (i.e. that would appear in .NET Framework 4.0).
David’s main topic was to walk through the details of the new Shader Effects model, which replaces the old Bitmap Effects feature.
What are Bitmap Effects?
These are effects that are applied to an individual UI element, like a button, to create some desired visual effect. This includes things like drop shadow, bevels and blur effects.
The BitmapEffect object was introduced in Framework 3.0 (the first WPF release). But there were some problems with it, that led to now replacing it with Shader Effects in 3.5SP1.
Problems with BitmapEffect:
- They were rendered in software
- Blur operations were very slow
- There were various limitations, including no ClearType support, no anisotripic filtering, etc.
New Shader Effects
Basic characteristics in the new Shader Effects include:
- GPU accelerated
- Have implemented hardware acceleration of the most popular bitmap effects
- But did not implement outer glow
- Can author custom hardware-accelerated bitmap effects using HLSL
- There is a software-only fallback pipeline that is actually faster than the old Bitmap Effects
- New Shader Effects run on most video cards
- Require PixelShader 2.0, which is about 5 years old
How Do You Do Shader Effects?
Here’s an outline of how you use the new Shader Effect model:
- Derive a custom class from the new ShaderEffect class (which derives from Effect)
- You write your actual pixel shader code in HLSL, which is used for doing custom hardware-accelerated stuff using Direct3D
- Language is C-like
- Compiled to byte-code, consumed by video driver, runs on GPU
- Some more details about HLSL, as used in WPF
- DirectX 10 supports HLSL 4.0
- WPF currently only supports Pixelshader 2.0
So what do pixel shaders really do? They basically take in a texture (bitmap) as input, do some processing on each point, and return a revised texture as an output.
Basically, you have a main function that accepts the coordinates of the current single pixel to be mapped. Your code then accesses the original input texture through a register, so it just uses the input parameter (X/Y coordinate) to index into the source texture. It then does some processing on the pixel in question and returns a color value. This resultant color value just represents—the resulting RGB color at the specified coordinate.
The final step is to create, in managed code, a class that derives from ShaderEffect and hook it up to the pixel shader code (e.g. xyz.ps file) that you wrote. You can then apply your shader to any WPF UIElement using XAML. (By setting the Effect property).
David’s next topic was to talk a bit about interop’ing with Direct3D. This just means that your WPF application can easily host Direct3D content by using a new class called D3DImage.
This was pretty cool. David demoed displaying a Direct3D wireframe in the background (WPF 3D subsystem can’t do wireframes), with WPF GUI elements in the foreground, overlaying the background image.
The basic idea is that you create a Direct3D device in unmanaged code and then hook it to a new instance of a WPF D3DImage element, which you include in your visual hierarchy.
Finally, David touched very briefly on some possible future features. These are things that may show up in WPF 4.0 (.NET Framework 4.0), or possibly beyond that.
Some of the features likely included in WPF 4.0 include:
- Increased graphical richness (e.g. Pixelshader 3.0)
- Offloading more work to the GPU
- Better rendering quality
- Integrate DirectWrite for text clarity
- Layout rounding
And some of the possible post-4.0 features include:
- Better exploitation of hardware
- Vertex shaders
- Shader groups
- Shaders in WPF 3D
- 3D improvements
- Better media extensibility
You can get at David’s PDC08 slide deck for this talk here: http://mschnlnine.vo.llnwd.net/d1/pdc08/PPTX/PC07.pptx
And you can find full video from the session at: http://mschnlnine.vo.llnwd.net/d1/pdc08/WMV-HQ/PC07.wmv