<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://forums.xna.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Samples, Starter Kits, Tutorials</title><link>http://forums.xna.com/forums/59.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 0.0)</generator><item><title>Re: Adding support for soft particles to the 3d particle sample</title><link>http://forums.xna.com/forums/thread/179782.aspx</link><pubDate>Mon, 18 May 2009 18:59:42 GMT</pubDate><guid isPermaLink="false">4aa5dbf6-357b-46b2-b5b2-1b660a6dc370:179782</guid><dc:creator>mtnPhil</dc:creator><slash:comments>0</slash:comments><comments>http://forums.xna.com/forums/thread/179782.aspx</comments><wfw:commentRss>http://forums.xna.com/forums/commentrss.aspx?SectionID=59&amp;PostID=179782</wfw:commentRss><description>Well, it means you have to render your solid geometry a 2nd time, and switch out render targets.&lt;br /&gt;
And the previously-very-simple particle pixel shader gets significantly longer.  So there is definitely some performance impact.&lt;br /&gt;
&lt;br /&gt;
I haven&amp;#39;t noticed any slowdowns, but I am not GPU limited.&lt;br /&gt;
&lt;br /&gt;
Here is a example of before and after:&lt;br /&gt;
&lt;a href="http://mtnphil.com/Games/SoftParticles.png"&gt;Comparison of before and after&lt;/a&gt;</description></item><item><title>Re: Adding support for soft particles to the 3d particle sample</title><link>http://forums.xna.com/forums/thread/179634.aspx</link><pubDate>Mon, 18 May 2009 14:05:43 GMT</pubDate><guid isPermaLink="false">4aa5dbf6-357b-46b2-b5b2-1b660a6dc370:179634</guid><dc:creator>SiriusSeven</dc:creator><slash:comments>0</slash:comments><comments>http://forums.xna.com/forums/thread/179634.aspx</comments><wfw:commentRss>http://forums.xna.com/forums/commentrss.aspx?SectionID=59&amp;PostID=179634</wfw:commentRss><description>Wow cheers mate - will definately take a look at this later : ) &lt;div&gt;Any idea of what kind of extra performance (if any) it requires from your game and hardware? &lt;/div&gt;</description></item><item><title>Adding support for soft particles to the 3d particle sample</title><link>http://forums.xna.com/forums/thread/179009.aspx</link><pubDate>Sat, 16 May 2009 23:59:17 GMT</pubDate><guid isPermaLink="false">4aa5dbf6-357b-46b2-b5b2-1b660a6dc370:179009</guid><dc:creator>mtnPhil</dc:creator><slash:comments>0</slash:comments><comments>http://forums.xna.com/forums/thread/179009.aspx</comments><wfw:commentRss>http://forums.xna.com/forums/commentrss.aspx?SectionID=59&amp;PostID=179009</wfw:commentRss><description>Since it took me a while to figure all this out, I thought I&amp;#39;d write something up.  It&amp;#39;s not a complete sample (it will take some fiddling to integrate with whatever you are doing, and I don&amp;#39;t show the CPU code for generating the depth texture for example), but it shows how I modified the 3d particle sample (in the education section) to support soft particles, and have it work on the Xbox. &lt;br /&gt;
&lt;br /&gt;
Soft particles greatly improve the look of a particle engine - no more hard edges where the particles intersect solid geometry in the scene.&lt;br /&gt;
&lt;br /&gt;
The main challenges were:&lt;br /&gt;
- getting proper depth information for a particle in the pixel shader for point sprites&lt;br /&gt;
- figuring out a replacement for VPOS (in order to sample the depth texture), since VPOS isn&amp;#39;t useful when predicated tiling is triggered on the Xbox&lt;br /&gt;
&lt;br /&gt;
First I create a depth texture using SurfaceFormat.Single (32 bit floating point), which I render by doing an additional pass on my solid geometry.  I store a z value in the texture which is the z value from the POSITION semantic, scaled to fit in 0-1.  I use an arbitrary number to scale it - the furthest distance I expect to have in my scene.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border-bottom:#7f9db9 1px solid;border-left:#7f9db9 1px solid;background-color:white;font-family:courier new;font-size:11px;overflow:auto;border-top:#7f9db9 1px solid;border-right:#7f9db9 1px solid;"&gt;
&lt;table style="border-bottom:#eee 0px solid;border-right-width:0px;background-color:#fff;margin:2px 0px;width:99%;border-collapse:collapse;border-top-width:0px;border-left-width:0px;" cellspacing="0" cellpadding="0"&gt;
    
    
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-size:11px;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;struct&lt;/span&gt;&lt;span style="font-size:11px;"&gt; VS_DEPTH_OUTPUT  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    float4 Position : POSITION;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; Depth : TEXCOORD0;  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;};  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;VS_DEPTH_OUTPUT RenderDepthMapVS(float3 position: POSITION)  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    VS_DEPTH_OUTPUT output;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#008000;"&gt;//generate the world-view-projection matrix &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    float4x4 wvp = mul(mul(world, view), projection);  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#008000;"&gt;//transform the input position to the output &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    output.Position = mul(float4(position, 1.0), wvp);  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    output.Depth = output.Position.z;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:11px;"&gt; output;    &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;} &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#808080;"&gt;#define MAXDEPTH 100 &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;float4 RenderDepthMapPS(float2 input : TEXCOORD0) : COLOR  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; depth = input.x / MAXDEPTH;  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:11px;"&gt; float4(depth, 0, 0, 1); &lt;/span&gt;&lt;span style="color:#008000;"&gt;// in red channel &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;} &lt;/td&gt;
        &lt;/tr&gt;
    
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
So I now have a 32bit floating point depth texture, with values from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
In the particle sample, I add a bunch of extra information into another COLOR semantic.  This appears to have sufficient precision on the Xbox, but may not on PC graphics cards (apparently 8bit precision is common, which wouldn&amp;#39;t be enough).  It&amp;#39;s possible some PC graphics cards may not support an additional COLOR semantic too?&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border-bottom:#7f9db9 1px solid;border-left:#7f9db9 1px solid;background-color:white;font-family:courier new;font-size:11px;overflow:auto;border-top:#7f9db9 1px solid;border-right:#7f9db9 1px solid;"&gt;
&lt;table style="border-bottom:#eee 0px solid;border-right-width:0px;background-color:#fff;margin:2px 0px;width:99%;border-collapse:collapse;border-top-width:0px;border-left-width:0px;" cellspacing="0" cellpadding="0"&gt;
    
    
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-size:11px;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;struct&lt;/span&gt;&lt;span style="font-size:11px;"&gt; VertexShaderOutput  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    float4 Position : POSITION0;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float4 Color : COLOR0;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    float4 Rotation : COLOR1;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; Size : PSIZE0;  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    float4 ExtraInfo : COLOR2;  &lt;span style="color:#008000;"&gt;// x: depth(z) &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;                                &lt;span style="color:#008000;"&gt;// y: pointsize &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                                &lt;span style="color:#008000;"&gt;// zw: xy screenpos (relative to (0,0)-(1,1)) for center of particle &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;}; &lt;/td&gt;
        &lt;/tr&gt;
    
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
And to fill these in, I do something like this in the vertex shader:&lt;br /&gt;
&lt;div style="border-bottom:#7f9db9 1px solid;border-left:#7f9db9 1px solid;background-color:white;font-family:courier new;font-size:11px;overflow:auto;border-top:#7f9db9 1px solid;border-right:#7f9db9 1px solid;"&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style="border-bottom:#7f9db9 1px solid;border-left:#7f9db9 1px solid;background-color:white;font-family:courier new;font-size:11px;overflow:auto;border-top:#7f9db9 1px solid;border-right:#7f9db9 1px solid;"&gt;
&lt;table style="border-bottom:#eee 0px solid;border-right-width:0px;background-color:#fff;margin:2px 0px;width:99%;border-collapse:collapse;border-top-width:0px;border-left-width:0px;" cellspacing="0" cellpadding="0"&gt;
    
    
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-size:11px;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Fill in the extra info for soft particles. &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    output.ExtraInfo.x = output.Position.z; &lt;span style="color:#008000;"&gt;// Same depth across the particle &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    &lt;span style="color:#008000;"&gt;// Ok to divide by w here, since there is no interpolation (and flip the y coord) &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float2 screenPosition = (output.Position.xy / output.Position.w) * float2(0.5, -0.5) + float2(0.5, 0.5);     &lt;span style="color:#008000;"&gt;// screenPosition is relative to topleft:(0,0) to bottomRight:(1,1) &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    output.ExtraInfo.zw = screenPosition;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    output.ExtraInfo.y = output.Size; &lt;/td&gt;
        &lt;/tr&gt;
    
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
To figure out the screen position for the point sprite:&lt;br /&gt;
- I have the screen position of the center of the sprite (ExtraInfo.zw above).&lt;br /&gt;
- I know the size of the point sprite in pixels (ExtraInfo.y above)&lt;br /&gt;
- I know the texture coords go from (0,0) to (1,1) from topleft to bottom right&lt;br /&gt;
- Using this info, I can calculate the screen position of the pixel being rendered, and use this position to know where to sample from the depth texture.  I was worried about rounding (I&amp;#39;m not sure how the rasterizer handles the PSIZE semantic) and maybe having some off-by-one errors.  But I haven&amp;#39;t noticed anything bad yet.&lt;br /&gt;
&lt;br /&gt;
Here is the relevant parts of the pixel shader, showing how I:&lt;br /&gt;
- calculate the screen position (to make up for the VPOS semantic I can&amp;#39;t use)&lt;br /&gt;
- use this to sample the depth texture, and fade the particle alpha to zero as the particle is closer to solid geometry in the scene.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border-bottom:#7f9db9 1px solid;border-left:#7f9db9 1px solid;background-color:white;font-family:courier new;font-size:11px;overflow:auto;border-top:#7f9db9 1px solid;border-right:#7f9db9 1px solid;"&gt;
&lt;table style="border-bottom:#eee 0px solid;border-right-width:0px;background-color:#fff;margin:2px 0px;width:99%;border-collapse:collapse;border-top-width:0px;border-left-width:0px;" cellspacing="0" cellpadding="0"&gt;
    
    
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-size:11px;"&gt;float2 ViewportSize; &lt;/span&gt;&lt;span style="color:#008000;"&gt;// This is an effect parameter you supply &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#008000;"&gt;// Pixel shader input structure for particles that do not rotate. &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#0000ff;"&gt;struct&lt;/span&gt;&lt;span style="font-size:11px;"&gt; NonRotatingPixelShaderInput  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float4 Color : COLOR0; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#808080;"&gt;#ifdef XBOX &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float2 TextureCoordinate : SPRITETEXCOORD; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#808080;"&gt;#else &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float2 TextureCoordinate : TEXCOORD0; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#808080;"&gt;#endif &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float4 ExtraInfo : COLOR2;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;};  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;texture DepthTexture; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#808080;"&gt;#define MAXDEPTH 100 &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;sampler depthSampler = sampler_state  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    Texture = (DepthTexture);  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;      &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    MinFilter = Point;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    MagFilter = Point;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    MipFilter = Point;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;      &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    AddressU = Clamp;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    AddressV = Clamp;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;}; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#808080;"&gt;#define CONTRAST_POWER 1.2 &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;#define FADE_DISTANCE 1     &lt;span style="color:#008000;"&gt;// Distance in world coordinates over which to fade the particle from full to 0. &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#008000;"&gt;// pixelPosition: screen coordinate in pixels &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#008000;"&gt;// particleDepth: depth of particle in world space &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; CalculateZFade(float2 pixelPosition, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; particleDepth)  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; zFade = 1;  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    float2 screenUV = pixelPosition / ViewportSize;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; sceneDepth = tex2D(depthSampler, screenUV).x;   &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:11px;"&gt; (sceneDepth != 0) &lt;/span&gt;&lt;span style="color:#008000;"&gt;// I take 0 to mean depth wasn&amp;#39;t set, though you could also clear your depth texture to some value that  &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;makes sense  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    {  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;        sceneDepth *= MAXDEPTH; &lt;span style="color:#008000;"&gt;// Expand back out from 0-1 to actual world coordinates &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;      &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;        &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; input = ((sceneDepth - particleDepth) / FADE_DISTANCE);  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;          &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="font-size:11px;"&gt; ((input &amp;lt; 1) &amp;amp;&amp;amp; (input &amp;gt; 0))  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;        {  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;            &lt;span style="color:#008000;"&gt;// Make it fade smoothly from 0 and 1 - I think I grabbed this curve from some nVidia paper &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;            zFade = 0.5 * pow(saturate(2*((input &amp;gt; 0.5) ? (1 - input) : input)), CONTRAST_POWER);  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;            zFade = (input &amp;gt; 0.5) ? (1 - zFade) : zFade;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;        }  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;        {  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;            zFade = saturate(input);  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;        }  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    }  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:11px;"&gt; zFade;  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;}  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#008000;"&gt;// Calculates pixel position (0,0 to ViewportSize) given: &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#008000;"&gt;//  - the center position of the particle &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#008000;"&gt;//  - the particle size (in pixels) &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;&lt;span style="color:#008000;"&gt;//  - the current texture coordinate &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;float2 CalculateParticlePixelPosition(float2 centerPosition, &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; size, float2 texCoord)  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    centerPosition *= ViewportSize;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#008000;"&gt;// From here on, everything is in pixels &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    float2 offset = texCoord * float2(size, size);  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float2 upperLeft = centerPosition - size / 2;  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:11px;"&gt; upperLeft + offset;  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;}  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;float4 FadeParticleAlpha(float4 color, &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; depth, float2 pixelPosition)  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt;&lt;span style="font-size:11px;"&gt; zFade = CalculateZFade(pixelPosition, depth);  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    &lt;span style="color:#008000;"&gt;// I seem to get better results by fading each component (for emmissive particles) &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:11px;"&gt; float4(color.r * zFade, color.g * zFade, color.b * zFade, color.a * zFade);  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;}  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="color:#008000;"&gt;// Pixel shader for drawing particles that do not rotate, modified for soft particles &lt;/span&gt;&lt;span style="font-size:11px;"&gt; &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;float4 NonRotatingPixelShader(NonRotatingPixelShaderInput input) : COLOR0  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;{  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;    float2 pixelPosition = CalculateParticlePixelPosition(input.ExtraInfo.zw, input.ExtraInfo.y, input.TextureCoordinate);  &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="font-size:11px;"&gt; FadeParticleAlpha(tex2D(Sampler, input.TextureCoordinate) * input.Color, input.ExtraInfo.x, pixelPosition);  &lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="background-color:#f7f7f7;"&gt;} &lt;/td&gt;
        &lt;/tr&gt;
    
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Hope this helps someone!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description></item></channel></rss>