图6-9 绘出的三角形扇
设定绘制状态
Direct3D装置拥有数十种可以改变的设定项,以决定基本形状的绘制方式。这些设定称为绘制状态(render state)。您可以用IDirect3D-Device7::SetRenderState来改变一个绘制状态。这个方法用D3DRENDERSTATETYPE列举型态的一个成员作为参数,并给指定绘制状态一个新值。第二个参数的意义则是依据dwRenderStateType设定的值而定。 以下是本方法的函式宣告:
HRESULT IDirect3DDevice7::SetRenderState( ); 参数 dwRenderStateType 说明 本函式所改变的装置状态变量。这个参数可以是 D3DRENDER-STATETYPE列举型态的任何成员。 Direct3Ddevice绘制状态的新值。这个值会依 dwRenderStateType 参数而定。 D3DRENDERSTATETYPE dwRenderStateType , DWORD dwRenderState dwRenderState 所有的Direct3D绘制状态都有默认值,所以您不需要在开始绘制基本形状前先设定每个个别的绘制状态。您打算改变绘制状态时,必须考虑到您的程序需求。在某些情况下,您会在刚建立Direct3D装置时设定某个绘制状态。在其它状况下会在使用者改变程序的某个设定值或是绘制某个特别对象时去改变绘制状态。举例来说,以下的程序段会利用
SetRenderState来设定排除、上色、和填充模式下的绘制状态,以及一个单纯场景的环境光强度。
HRESULT CMyD3DApplication::Render() {
//清除检视埠。
lpDev7->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x000000ff,1.0f,0L); DWORD dwCullMode
=m_bCull ?D3DCULL_CCW :D3DCULL_NONE;
}
DWORD dwShadeMode DWORD dwFillMode
=m_bFlat ?D3DSHADE_FLAT :D3DSHADE_GOURAUD; =m_bWire ?D3DFILL_WIREFRAME :D3DFILL_SOLID;
lpDev7->SetRenderState(D3DRENDERSTATE_CULLMODE,dwCullMode); lpDev7->SetRenderState(D3DRENDERSTATE_SHADEMODE,dwShadeMode); lpDev7->SetRenderState(D3DRENDERSTATE_FILLMODE,dwFillMode); lpDev7->SetRenderState(D3DRENDERSTATE_AMBIENT, //场景开始。
if(SUCCEEDED(m_pd3dDevice->BeginScene())) {
if(m_pFileObject)
m_pFileObject->Render(m_pd3dDevice);
RGBA_MAKE(128,128,128,128));
//场景结束。
m_pd3dDevice->EndScene(); }
return S_OK;
在绘制基本形状时,请牢记住3D加速硬件可以快速的处理一连串同样型态的基本形状,但是若改变必要的绘图型态时即会减慢下来。切换到不同的贴图对映会减慢绘制动作,改变绘制状态时也是。为了达到最佳的效能,试着一次绘制出所有共享同一贴图(最好是同样的绘制状态)的基本形状,再改变贴图(必要时包括绘制状态),再绘制更多基本形状,依此类推。
以下的段落说明了您最可能采用的各种绘制状态。在后续的章节中,我们会涵盖这些状态的细节。但是目前我只会先快速简介这些可用的状态,让您可以开始了解这些命令如何搭配作用。
Alpha混色状态
藉由设定某些绘制状态,Alpha混色(也就是半透明对象的绘制)即可以发生作用。您可以用D3DRENDER-STATE_ALPHABLENDENABLE绘制状态,在支持这项功能的装置上打开alpha透明混色。D3DRENDERSTATE_ SRCBLEND和
D3DRENDERSTATE_DESTBLEND绘制状态定义了真正执行的Alpha混色型态。范例如下:
//
//启动alpha混色。 //
lpDev7->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE); //
//设定来源混色状态。 //
lpDev7->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCCOLOR); //
//设定目的混色状态。 //
lpDev7->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCCOLOR);
在设定这些状态后,您可以绘制出那些在顶点色彩、材质或贴图对映中包含了alpha的基本形状。当alpha值等于1.0时,对象会是不透明的。当alpha值等于0.0时,对象会是透明的。落在0.0和1.0间的值则会使得对象呈现半透明。
Alpha测试状态
Alpha测试(alpha testing)控制了像素是否会被写入绘图目标绘图页中。也就是说它会检查像素是被接受或拒绝。D3DRENDERSTATE_ALPHAREF绘制状态让您可以使用alpha测试来决定所要绘制的像素的色彩是否比该像素现有的色彩还来得不透明,这个过程中可用D3DPCMPCAPS_GREATEREQUAL绘制状态。如果打算绘制的色彩比较不透明,该像素即会被写入。如果色彩比较透明,就会略过写入动作。这种作法可以节省需要混合色彩的时间。
以下指令会设定目前的Direct3D装置,并根据一个alpha测试函式来测试每个像素:
//
//设定alpha测试状态。 //
if (pd3dDeviceDesc.dpcTriCaps.dwAlphaCmpCaps &
D3DPCMPCAPS_GREATEREQUAL) {
lpDev7->SetRenderState(D3DRENDERSTATE_ALPHAREF, (DWORD)0x00000001);
lpDev7->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE, TRUE);
lpDev7->SetRenderState(D3DRENDERSTATE_ALPHAFUNC, D3DCMP_GREATEREQUAL); }
您可以用D3DRENDERSTATE_ALPHAFUNC列举型态来设定alpha测试函式。您可以用D3DRENDERSTATE_ALPHAREF绘制状态来设定每个像素比较基准的参照alpha值。 在 第十章 会详细谈到实际执行alpha测试和决定现有装置是否支持alpha测试的原始程序。
环境打光状态
第五章 提过,所谓环境光是指环绕对象和从各个方向发出的光。这种打光可用在
RoadRage应用程序的背景打光上。您可以用IDirect3DDevice7::SetRenderState方法来控制环境打光的色彩,并且传给它列举值D3DLIGHTSTATE_ AMBIENT当第一个参数。第二个参数是RGBA格式的色彩。以下的程序设定了环境光色彩:
//
//设定环境光。 //
D3DCOLOR d3dclrAmbientLightColor =D3DRGBA(1.0f,1.0f,1.0f,1.0f); lpDev7->SetRenderState(D3DRENDERSTATE_AMBIENT, d3dclrAmbientLightColor);
柔边状态
柔边(antialiasing)可以让屏幕上的线条和边缘看起来较为平滑。,当Direct3D装置有支持但默认值是不执行的情况下,Direct3D提供了一种绘制状态作为全屏幕的柔边处理。(将D3DRENDERSTATE_ANTIALIAS设成D3DANTIALIASMODE成员之一的
D3DANTIALIAS_NONE,可以关闭全屏幕的柔边处理)。以下指令会启动与排序无关的柔
边功能(sort-independent antialiasing),这意谓着柔边效果不会受到多边形绘制的顺序所影响。
//
//设定柔边。 //
lpDev7->SetRenderState(D3DRENDERSTATE_ANTIALIAS,
D3DANTIALIAS_SORTINDEPENDENT);
裁切状态
基本形状若是有部分被绘到检视埠之外时,可以被裁切掉到。您可以设定
D3DRENDERSTATE_CLIPPING绘制状态为FALSE来关闭裁切(默认值是启动),如下:
//
//设定裁切状态。 //
lpDev7->SetRenderState(D3DRENDERSTATE_CLIPPING,FALSE);
基本形状裁切绘制状态和在顶点缓冲区中的顶点所用到的状态并不相同。
色彩键状态
您可以设定某个色彩键将键色视作透明。一旦如此,当贴图被应用在这种基本形状时,所有符合该键色彩的贴图就不会绘制在基本形状上(使基本形状的该点成为透明)。您可以用IDirectDrawSurface7::SetColorKey方法设定色彩键,运用在会使用该色彩键的绘图页上, 还可以用呼叫的方式来启动或关闭,如下:
//
//启动色彩键。 //
lpDev7->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE,FALSE);
将第二个参数设为TRUE可以启动色彩键;设为FALSE会关掉色彩键。