If you want to build a pixel shader for WPF there are some good examples and tools – some of which are:
- NShader – that lets you edit HLSL code in VS with syntax highlighting
- Shazzam – that helps edit and quickly test HLSL code + provides a few samples + generates WPF C#/VB wrapper classes automatically
- Shader Effect BuildTask – that makes the shader build automatically when you build your project
The build task is a helpful thing, since it builds the effect every time you build your project, so your shader source code is treated the same way your C# source is but not really so helpful if you want to share your code with someone who does not necessarily have DirectX SDK or the build task installed – since it will break their build. That is why I usually include both the fx source code and the compiled shader in my VS projects – this also lets me dig up my old WPF projects and build them without the need for having DirectX SDK installed, since I write shaders less frequently than I set up new dev. machines.
Now, I do not want to remember the fxc.exe build commands or manually compile each shader, so I also include a batch script in the shaders folder that I can manually trigger when I modify and want to recompile a shader.
Since even minor changes in your shader files are error prone – I wanted to have a clear message in my script to so I know if my compiler worked without having to read all output. When I first wrote it I thought I could use colors – green for success and red for failure, but I found setting these on a per-line basis is not supported in regular command-line windows, so I just used full screen color changes “color 0A” for green and “color 0C” for red.
Today I wanted to play with shaders again and as I looked at that script I remembered I found some interesting code here (copied from here) one day, that allows you to have a single file with batch script and C# code. I found a few lines of C# code on StackOverflow that let you change the colors in the console window and here is what I have:
Note 1: This script requires DirectX SDK to be installed.
Note 2: This would probably be easier in PowerShell and I might port it one day, but it was just more interesting to me to do it this hacky way. + I don’t really know PowerShell or if it is available everywhere yet.
/* >NUL
@REM Open the containing folder in Windows Explorer and double click this file to compile shader
CLS
@CALL :COMPILE_CECHO %0
@CALL :COMPILE_FX HueEffect.fx HueEffect.ps
@DEL /q cecho.exe
@GOTO :EOF
*/
using System;
using System.Linq;
class cecho
{
static void Main(string[] args)
{
try
{
Console.BackgroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), args[0], true);
Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), args[1], true);
Console.WriteLine(string.Join(" ", args.Skip(2)));
Console.ResetColor();
}
catch
{
Console.WriteLine("Usage: cecho background foreground text\r\nColors:");
foreach (var name in Enum.GetNames(typeof(ConsoleColor)))
Console.WriteLine(name + @": " + (int)Enum.Parse(typeof(ConsoleColor), name));
return;
}
}
}
/*
More batch code follows:
:COMPILE_CECHO
@SET WinDirNet=%WinDir%\Microsoft.NET\Framework
@IF EXIST "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"
@IF EXIST "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"
@IF EXIST "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe"
@%csc% /nologo /out:"cecho.exe" %1
@GOTO :EOF
:COMPILE_FX
@SET fxc="%DXSDK_DIR%Utilities\bin\x86\fxc.exe"
@SET FXCPARAMS=/nologo /T ps_2_0 /E main /Fo%2 %1
@REM ECHO %FXC% %FXCPARAMS%
@%FXC% %fxcparams% 1> NUL
@IF [%ERRORLEVEL%] EQU [0] (cecho 0 10 %1 - COMPILATION SUCCESSFULL!) ELSE (cecho 0 12 %1 - ERROR! FIX SHADER!)
@GOTO :EOF
*/