第08章透明融合与雾化11

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第8章透明融合与雾化效果在D3D中,“混合”发生在像素着色器阶段的下一阶段,即OutputMergerStage。整个场景在全部经历过像素着色器阶段后,对应于屏幕上每一点像素,可能有多个图元(Fragment)。如下图所示:该图中,场景中有三个点P1,P2,P3投影在屏幕上同一个点P。这样在像素着色器阶段后,针对P1,P2,P3将有三个图元与像素P对应。默认情况下,在渲染管线中,混合是被关闭的。这时为了确定像素P的最终显示颜色,主要依据是深度测试(这时暂不考虑模板测试等其他因素)。通过深度测试的图元将自身颜色替代后缓冲区中P点的当前颜色,未通过的图元被抛弃。当混合功能被打开时,决定最终颜色的方法有所不同。当一个图元通过深度测试后,并不是直接取代后缓冲区中P点的当前颜色,而是通过一定的比例因子与之进行插值(混合),并将结果作为P点的当前值。当然,未通过深度测试的图元依然被抛弃。这个是“混合”的一种最简单例子。除此之外,D3D针对混合阶段有非常多的配置,从而实现各种特殊效果。1.混合方程学习混合的第一步,就是要了解混合方程,计算alpha混合颜色的方程如下:该方程针对每个像素逐一进行。方程左边的C为混合结果,右边Csrc(我们称为源颜色)和Cdst(我们称为目标颜色)分别为即将要绘制的图元颜色值和后缓冲区中该像素当前的颜色;Fsrc和Fdst分别是两个颜色对应的混合因子(通常赋值为表示半透明度的alpha值,也可以是属于枚举D3DBLEND的任意值,用来和Csrc相乘)。注意方程中的在这里为“分量相乘”(Componentwisemultiplication),即针对颜色值中的R、G、B三种分量分别进行相乘。源颜色和目标颜色分别与相应的混合因子分量相乘后,将结果进行“op(混合操作)操作(缺少时,为D3DBLENDOP_ADD即相加运算),作为当前图元处理的最终颜色,并替换后缓冲区中该像素处的颜色。图形显示中,对于alpha混合最普遍的使用方法是:把Fsrc赋值为D3DBLEND_SRCALPHA,即当前绘制像素的alpha值;把Fdst赋值为D3DBLEND_INVSRCALPHA,即1减去当前绘制像素的alpha值。这样一来,计算公式等价与:C=(Csrc×alphasrc)+(Cdst×(1-alphasrc))2.混合操作针对上述公式中的混合操作”op,在D3D中定义在如下枚举类型中:typedefenum_D3DBLENDOP{D3DBLENDOP_ADD=1,D3DBLENDOP_SUBTRACT=2,D3DBLENDOP_REVSUBTRACT=3,D3DBLENDOP_MIN=4,D3DBLENDOP_MAX=5,D3DBLENDOP_FORCE_DWORD=0x7fffffff}D3DBLENDOP;我们省略各个变量的前缀D3DBLENDOP。ADD表示相加操作,即;SUBTRACT表示相关(目标-源),即;REV_SUBTRACT表示反射的相关(源-目标),即;MIN表示取源、目标颜色中较小值,即;MAX表示取源、目标颜色中较大值,即。注意:MIN和MAX操作与混合因子无关。同样,所有这些操作也适合于计算Alpha值。3.混合因子针对方程中的混合因子F,在D3D中有如下几种:typedefenum_D3DBLEND{D3DBLEND_ZERO=1,此外针对颜色混合,F为(0,0,0),针对alpha值,F为0。D3DBLEND_ONE=2,针对颜色混合为(1,1,1),针对alpha值为1;D3DBLEND_SRCCOLOR=3,针对颜色混合为(Rs,Gs,Bs),针对alpha值为As;D3DBLEND_INVSRCCOLOR=4,针对颜色混合为(1-Rs,1-Gs,1-Bs),针对alpha值为1-As;D3DBLEND_SRCALPHA=5,针对颜色混合为(As,As,As),针对alpha值为As;D3DBLEND_INVSRCALPHA=6,针对颜色混合为(1-As,1-As,1-As),针对alpha值为1-AsD3DBLEND_DESTALPHA=7,针对颜色混合为(Ad,Ad,Ad),针对alpha值为Ad;D3DBLEND_INVDESTALPHA=8,针对颜色混合为(1-Rd,1-Rd,1-Rd),针对alpha值为1-Ad;D3DBLEND_DESTCOLOR=9,针对颜色混合为(Rd,Gd,Bd),针对alpha值为AdD3DBLEND_INVDESTCOLOR=10,针对颜色混合为(1-Rd,1-Gd,1-Bd),针对alpha值为1-Ad;D3DBLEND_SRCALPHASAT=11,D3DBLEND_BOTHSRCALPHA=12,D3DBLEND_BOTHINVSRCALPHA=13,D3DBLEND_BLENDFACTOR=14,此时的混合因子为程序员指定的颜色值(R,G,B,A),针对颜色混合为(R,G,B),针对alpha值为AD3DBLEND_INVBLENDFACTOR=15,同上,为程序员指定颜色值,针对颜色混合为(1-R,1-G,1-B),针对alpha值为1-A。D3DBLEND_FORCE_DWORD=0x7fffffff}D3DBLEND;4混合的例子#included3dx9.h//-----------------------------------------------------------------------------//Desc:全局变量//-----------------------------------------------------------------------------LPDIRECT3D9g_pD3D=NULL;//Direct3D对象LPDIRECT3DDEVICE9g_pd3dDevice=NULL;//Direct3D设备对象LPD3DXMESHg_pMeshWall=NULL;//墙面网格对象LPD3DXMESHg_pMeshTorus=NULL;//圆环体网格对象LPD3DXMESHg_pMeshTeapot=NULL;//茶壶网格对象D3DMATERIAL9g_Materials[3]={0};//材质//-----------------------------------------------------------------------------//Desc:设置世界矩阵//-----------------------------------------------------------------------------//VOIDSetWorldMatrix()//{////创建并设置世界矩阵//D3DXMATRIXmatWorld;//D3DXMATRIXmatTrans;//D3DXMatrixTranslation(&matWorld,-2.0f,0.0f,0.0f);//平移//g_pd3dDevice-SetTransform(D3DTS_WORLD,&matWorld);//}//-----------------------------------------------------------------------------//Desc:设置观察矩阵和投影矩阵//-----------------------------------------------------------------------------VOIDSetupViewandProjMatrices(){//建立并设置观察矩阵D3DXVECTOR3vEyePt(0.0f,0.5f,-8.0f);D3DXVECTOR3vLookatPt(0.0f,0.0f,0.0f);D3DXVECTOR3vUpVec(0.0f,1.0f,0.0f);D3DXMATRIXmatView;D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);g_pd3dDevice-SetTransform(D3DTS_VIEW,&matView);//建立并设置投影矩阵D3DXMATRIXmatProj;D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);g_pd3dDevice-SetTransform(D3DTS_PROJECTION,&matProj);}//-----------------------------------------------------------------------------//Desc:设置材质和灯光//-----------------------------------------------------------------------------VOIDSetLight(){//设置灯光D3DXVECTOR3vecDir;D3DLIGHT9light;ZeroMemory(&light,sizeof(D3DLIGHT9));light.Type=D3DLIGHT_DIRECTIONAL;light.Diffuse.r=1.0f;light.Diffuse.g=1.0f;light.Diffuse.b=1.0f;vecDir=D3DXVECTOR3(0,0,1);D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction,&vecDir);light.Range=1000.0f;g_pd3dDevice-SetLight(0,&light);g_pd3dDevice-LightEnable(0,TRUE);g_pd3dDevice-SetRenderState(D3DRS_LIGHTING,true);}//-----------------------------------------------------------------------------//Desc:初始化Direct3D//-----------------------------------------------------------------------------HRESULTInitD3D(HWNDhWnd){//创建Direct3D对象,该对象用于创建Direct3D设备对象if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))returnE_FAIL;//设置D3DPRESENT_PARAMETERS结构,准备创建Direct3D设备对象D3DPRESENT_PARAMETERSd3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;//创建Direct3D设备对象if(FAILED(g_pD3D-CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice))){returnE_FAIL;}//长方体D3DXCreateBox(g_pd3dDevice,5.0f,4.0f,0.0f,&g_pMeshWall,NULL);g_Materials[0].Ambient=D3DXCOLOR(0.6f,0.6f,0.6f,1.0f);g_Materials[0].Diffuse=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);g_Materials[0].S

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功