您的位置:首页 > 其它

shader学习笔记——运动模糊(motion blur)

2010-09-05 22:58 141 查看
运动模糊(motion blur)
运动模糊效果的工作流程





1.先将场景渲染到一个RenderTarget1上
2.将RenderTarget1跟上一帧渲染的结果进行混合, 并输出到RenderTarget2
3.将RenderTarget2输出到屏幕, 并将其保留到下一帧进行混合
ScreenAlignedQuad:一个正方形网格

Pass0的设置和代码:



RenderTarget 开启颜色清除和深度缓冲清除。

Vertex Shader代码:
float4x4 matViewProjection;
struct VS_INPUT
{
float4 Position : POSITION0;
float2 Txr1 : TEXCOORD0;

};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 Txr1 : TEXCOORD0;

};
VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;

Output.Position = mul( Input.Position, matViewProjection );//位置
Output.Txr1 = Input.Txr1;//获取纹理

return( Output );

}
Pixel Shader代码:
sampler Texture0;
float4 ps_main(
float4 inDiffuse: COLOR0,
float2 inTxr1: TEXCOORD0
) : COLOR0
{
// Output color:
return tex2D(Texture0,inTxr1); //纹理映射
}

Blur1的设置和代码:



RenderState设置
D3DCULLMODE – D3DCULL_NONE,
D3DRS_ZENABLE – D3DZB_FALSE,
D3DRS_ZWRITEENABLE – FALSE.
Texture0设置:



Vertex Shader代码:
float4x4 matViewProjection;
struct VS_INPUT
{
float4 Position : POSITION0;
};
struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 texCoord : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
// Simply output the position without transforming it
Output.Position = float4(Input.Position.xy,0,1);
// Texture coordinates are setup so that the full texture
// is mapped completeley onto the screen
Output.texCoord.x = 0.5 * (1 + Input.Position.x);
Output.texCoord.y = 0.5 * (1 - Input.Position.y);
return( Output );
}
Pixel Shader 代码:
float4 blurFactor;
sampler Texture0;
sampler Texture1;
float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR0
{
float4 col1 = tex2D(Texture0, texCoord);
float4 col2 = tex2D(Texture1, texCoord);

return lerp(col1,col2,blurFactor);
}

Present的设置和代码:



Texture0设置



Vertex Shader代码:

float4x4 matViewProjection;

struct VS_INPUT
{
float4 Position : POSITION0;
};

struct VS_OUTPUT
{
float4 Position : POSITION0;
float2 texCoord : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
VS_OUTPUT Output;
Output.Position = float4(Input.Position.xy,0,1);
Output.texCoord.x = 0.5 * (1 + Input.Position.x);
Output.texCoord.y = 0.5 * (1 - Input.Position.y);
return( Output );
}
Pixel Shader代码:
sampler Texture0;
float4 ps_main(float2 texCoord: TEXCOORD0) : COLOR0
{
// Simply read the temporary texture and send
// the color to the output without manipulating it
return tex2D(Texture0, texCoord);
}
效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: