使用Alpha Blending的方式来实现伪运动模糊的效果<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
潘李亮 2003 8 31
Stanly Lee 2003-10-4
Email : xheartblue@etang.com
Homepage gamehunter.3322.net/xpertsoft/
我们知道运动模糊效果能给我们的场景带来很大的视觉真实性。通常的书上和其他的地方介绍的运动模糊的实现方法都是基于累积缓冲区的。这种方法的优点是精确,有的地方称之为时间过采样的运动模糊。但是这种方法的一个致命缺点是速度慢,通常速度是你累积缓冲累积次数的倒数倍,这在一个实时系统里的开销是很大的。因此我们需要在这里做个折中:我们可以不采用时间过采样的方法,而是把前面的渲染结果和当前的渲染结果累积起来。形成一种称为“伪”运动模糊的效果,实践证明,这种方法的效果还是可以接受的。
在前段时间做毕业设计的《大规模室外场景的渲染》的时候,我在Game Tutorils上找到了一种方法,我们把前面的渲染结果保存在一个纹理中,然后渲染当前的场景,再在场景上画一个覆盖整个视口的的矩形,这个矩形用我们保存的纹理来进行映射,并用Alpha值进行一定的衰减。(具体的实现方法可以到Game Tutorils上去找,也可以参考我的Demo)。理论上这种方法只要渲染场景一次。但是实际上它还是会带来比较大的性能牺牲的,如拷贝纹理数据,映射纹理等。
下面我来介绍一种只需要绘制一个矩形的运动模糊效果。这种方法对需要更新整个屏幕的场景是 主要的思想如下。我们知道,以前的渲染结果是保存在帧缓冲区里的。我们需要的仅仅是把它进行一定的衰减,然后把它和我们的场景进行混合。衰减过程我们只要在视口上画一个黑色的带有一定的Alpha Blending 的效果的矩形就可以了。下面是我给出来的关键代码。这个效果不会损失多少的FPS。但是出来的效果却很不错。我最后说明一下不足的地方,也就是缺陷:它要求我们绘制的场景时候要使用Alpha Blending,把渲染结果和以前的结合起来。当然你可以不用Alpha Blending,但是这样的话,如果你的场景更新了整个屏幕的话。运动模糊效果就没有了。也就是说它比较适合做一些小小Demo的特殊效果。
效果图。
void Render()
{
//注意,这句一定把它注释掉,不然你的运动模糊就出不来了。
//当然你要在程序进入消息循环前,把设备的Render Target清除了。如果
//g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//不清除渲染目标,但是深度缓冲,模板缓冲一类的东西你是还要清除的。
g_pD3DDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//开始绘制。
g_pD3DDevice->BeginScene();
//开启Alpha Blending
g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
//关闭灯光和纹理节省开销。
g_pD3DDevice->SetRenderState( D3DRS_LIGHTING,FALSE );
g_pD3DDevice->SetFVF(CUSTOM_FVF);
g_pD3DDevice->SetStreamSource(0,g_pVBuffer,0,sizeof(CUSTOM_VERTEX));
g_pD3DDevice->SetTexture(0,0);
//设置AlphaBlending的因子。
g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);
//绘制一个Alpha值在0-0xFF之间的矩形,
//这个矩形刚好填充满整个视口
DrawARect();
//设置场景的投影方式和变换矩阵
SetSenceTrans();
//到这里,你就可以打开灯光了。
g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
//绘制正常情况下的场景。
DrawSence();
//绘制结束,
g_pD3DDevice->EndScene();
g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
分享到:
相关推荐
### 使用Alpha-Blending技术实现图片水印效果 #### 一、引言 Alpha-Blending,也称α混合,是一种常用于二维或三维游戏中使图像产生透明或半透明效果的技术。非数字加密隐藏目的而添加的图片水印主要用于声明图片...
在编程实现Alpha Blending时,我们通常需要使用到图形库,如OpenGL、DirectX或现代的WebGL,它们提供了现成的API来处理Alpha Blending。例如,OpenGL中的glBlendFunc函数允许设置源和目标图像的混合方式,通过调整...
本资源包含的"01_MotionBlur"文件可能是一个实现运动模糊效果的代码库或者示例项目,非常适合对运动模糊感兴趣或者在游戏开发、视频编辑等领域工作的人士使用。 运动模糊的原理主要基于两个关键概念:速度和时间。...
AlphaBlending_demo 是一个基于VC++的项目,用于展示如何在Windows环境中实现图像的透明度效果,即Alpha Blending。这个技术广泛应用于图形用户界面,让图像或控件能够具有不同程度的透明或半透明效果,使得界面上的...
总的来说,AlphaBlend在.NET Compact Framework下的实现涉及到GDI+的使用,通过调整Alpha通道实现图片的透明效果,这在Windows CE和Windows Mobile的UI设计中非常常见,能为应用程序带来丰富的视觉体验。
除了这些基本步骤,还可以通过调整Alpha Blending的参数,实现更复杂的效果,比如预乘Alpha(premultiplied alpha)、颜色剪切(color clamping)和深度排序等。预乘Alpha处理了颜色和Alpha的关系,颜色剪切防止颜色...
Alpha Blending是一种在计算机图形学中广泛使用的混合技术,主要用于处理图像透明度和半透明效果。在给定的“alphablend_demo.zip”压缩包中,包含了一系列的C++源代码文件,如AlphaBlending.cpp、AlphaBlend.cpp等...
在计算机图形学中,Alpha Blending是一种混合两个或更多图像像素的方法,通常用于实现透明或半透明效果。每个像素包含一个颜色值和一个Alpha通道,Alpha值表示像素的不透明度。通过将源图像与目标图像的像素按照各自...
在DirectX 9中,Alpha混合(Alpha Blending)是一种重要的图形渲染技术,它允许我们创建半透明或透明效果,使图像元素能够彼此混合,从而产生丰富的视觉效果。这个压缩包"dx9_alpha_blending_material.zip"显然是为...
泊松融合(Poisson Blending)是一种高级的图像融合技术,它主要用于图像合成和编辑,使得两张图像的交界处能够实现无缝对接,过渡效果自然,无明显的边界痕迹。这种技术尤其适用于图像拼接、场景合成等领域,可以极...
OpenGL 中的很多特效都是通过混合(Blending) 来完成的, 混合就是把屏幕上已有的颜色... Alpha值是颜色的第4个分量, 过去你使用GL_RGB 也就是3个颜色分量来指定一个颜色, 现在你可以使用GL_RGBA 来增加一个Alpha值了
在本项目"DirectX_RPG_Chap02_03_AlphaBlend"中,我们主要探讨的是DirectX编程中的一项关键技术——Alpha Blending,它在角色扮演游戏中(RPG)广泛应用,用于实现图像的透明度效果,使得游戏场景更加真实生动。...
在 Unity3d 中,我们可以使用多种方法来实现半透明效果,例如使用 alpha blending、 additive blending 等。但是,使用 ZTest 来实现半透明效果是最常见的方法之一。 在 Unity3d 插件中,我们可以使用多种语言来...
在计算机图形学领域,Alpha混合(Alpha Blending)是一种重要的技术,用于实现图像或像素的透明和半透明效果。在DirectX编程中,它被广泛应用于游戏开发、图像处理和其他实时渲染应用。本文将深入探讨Alpha混合的...
通过使用一个称为Alpha Matte的数组(大小与图像相同),可以实现对不同部分的混合,其中a的值可以从0(背景)变化到1(对象),或者介于两者之间。这种技术使得图像的某些部分可以部分透明,从而产生平滑的过渡效果...
OPENGL实现彩虹效果源代码 本资源提供了一个使用OpenGL实现...本资源提供了一个完整的OpenGL实现彩虹效果的源代码,涵盖了OpenGL基础知识、GLUT库、OpenGL渲染管线、颜色和材质、线和曲线、Alpha Blending等知识点。
例如,一个玻璃球体不仅可以透过HLSL实现Alpha Blending展现出内部结构,还可以利用Cube Mapping来表现其表面的反射效果,使得虚拟物体看起来更加逼真。 总的来说,Alpha Blend和Color混合是现代计算机图形学中不可...
本教程将深入探讨如何在ListView中应用AlphaBlending函数来实现半透明效果。 Alpha Blending是一种图像处理技术,它可以混合两个图像,其中一个图像具有透明度信息(即Alpha通道),从而创造出平滑的过渡效果。在...
在计算机图形学中,Alpha混合(Alpha Blending)是一种用于实现图像或像素的半透明效果的技术。这种技术广泛应用于2D和3D图形渲染、游戏开发、图像编辑软件等领域。在C语言中实现Alpha混合算法,可以让我们更好地...
OpenGL支持多种颜色处理方式,包括颜色混合、alpha blending等。在时钟程序中,用户可以互换表针和背景颜色,这涉及到颜色的选择、设置以及混合算法的应用。 **几何变换**: 为了显示表针的运动,OpenGL需要进行...