您的位置:首页 > 其它

[翻译]XNA 3.0 Game Programming Recipes之nine

2009-07-21 11:36 501 查看
PS:自己翻译的,转载请著明出处
2-13.创建一个模糊/发光的Post-Processing效果
问题 你想在你最终的图象上添加一个模糊的效果,或者你想添加一个发光的对象在你的屏幕上。
解决方案
这两个效果都是post-processing效果。在上一节中学习了怎么设置一个post-processing框架。发光效果的选择,因为它演示了如何融合更多的着色通行的输出。
您可以获取模糊效应计算每个像素的平均颜色值约周围的像素,然后将原来的颜色的像素用这个平均值取代。例如,在图2-25这个网格,它是一个需要被模糊的图象,你如何计算象素9的结果颜色值?
Code
1 technique VerBlurAndGlow
2 {
3 pass Passo
4 {
5 VertexShader=compile vs_1_1 PassThroughVertexShader();
6 PixelShader=compile ps_2_0 VerBlurPS();
7 }
8 pass Pass1
9 {
10 AlphaBlendEnable=true;
11 SrcBlend=SrcAnlpha;
12 DestBlend=InvSrcAlpha;
13 PixelShader=compile ps_2_0 BlendInPS();
14 }
15 } 第二阶段是新的。你可以看到三个绘制状态被改变在通过的开始:您启用混合,并设置alpha功能。您可以了解更多关于此alpha功能用几分钟。效果将首先在第一次阶段时开始,因此,模糊图像将出现在后备缓冲区。接下来,在第二阶段将开始,让您共混在原始图像的形象在后备缓冲区。
这是象素着色器在第二阶段:
1 //-------PP Technique:VerBlurAndGlow----
2 pppixelToFrame BlendInPS(PPVertexToPixel PSIn):COLORo
3 {
4 PPPixelToFrame Output=(PPPixelToFrame)o;
5 float4 finalColor=tex2D(originalSampler,PSIn.TexCoord);
6 finalColor.a=0.3f;
7 Output.Color=finalColor;
8 return Output;
9 } 这里,你指定初始图象的象素颜色和调整alpha值。当与XNA相混合,以下规则产生最终结果:
1 finalColor=sourceBlend*sourceColor+destBlend*destColor 在技术效果定义中,你要设置sourceBlendSourceAlpha。也就是说sourceBlend等同于alpha的颜色的值你想混合,它是0.3f,正如你在先前代码中定义的。此外,你要设置destBlendInvSourceAlpha,也就是说1-SourceAlpha. 所以,destBlend会是1-0.3f=0.7f。
总之,百分之70的最终颜色将会从已经在后备缓冲采取(第一阶段的模糊效果被储存)。其余的百分之三十将采取的新的色彩要写回后备缓冲区,而在这种情况下, 从原来的形象里采样。
你还没有定义originalSample。把这个添加到你效果文件的顶部:
1 texture originalImage;
2 sampler originalSampler=sampler_state
3 {
4 texture=<originalImage>;
5 magfilter=LINEAR;
6 minfilter=LINEAR;
7 mipfilter=LINEAR;
8 }; 在你的XNA工程中,你应该保存初始的图象这样你可以截取后备缓冲里的originalImage变量。幸运的是,在前面的章节我们使用了框架,在第一次效果里,你很容易的实现:
1 if(currentTechnique=0)
2 {
3 device.ResolveBackBuffer(resolveTexture,0);
4 textureRenderedTo=resolveTexture;
5 ppEffect.Parameters["originalImage"].SetValue(textureRenderedTo);
6 } 最后一行代码传递了初始的图象到你的HLSL效果
现在,所有的效果已经准备就绪,此代码将首先垂直模糊图片。随后, 这一结果将首先由横向模糊首次通过的VerBlurAndGlow的效果。 在第一阶段,将继续模糊图像帧缓冲区内,让您共混物中的原始图像!
1 List<string> ppEffectsList=new List<string>();
2 ppEffectsList.Add("HorBlur");
3 ppEffectsList.Add("VerBlurAndGlow");
4 postProcessor.Parameters["xBlurSize"].SetValue(0.5f);
5 postProcessor.PostProcess(ppEffectsList);代码
课外阅读
每完成游戏中包含了一套后处理的影响,因为它们有潜力将额外的联系到最后的图片。虽然模糊作用是一个相对容易的概念, 某种模糊或发光几乎总是用于一些不完善的3D对象的边缘。
整个系列的后处理的效果确实存在,但与发光效果,利用多种途径和alpha混合,你理解关于它们的基础知识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: