DIRECT3D状态详解
DIRECT3D态态解状
Microsoft Direct3D??态态是一态机。态用程序态置光照、渲染和态态模态的态~然后在渲染态个状状
态态据态态。数它
本态描述态形流水态用到的所有不同态型的态。状
• 渲染态状
• 取态器态状
• 态理态态状
• 状态态
渲染态状
态态渲染态控制状Microsoft? Direct3D?态态光态化模态的行态~态通态改态渲染态的性~使用它状属何态态型的着色算法~态性和其光态化器操作到态目的。属它来达个
C++态用程序通态态用IDirect3DDevice9::SetRenderState 方法控制渲染态的性状属。
D3DRENDERSTATETYPE 枚态态型指定所有可能的渲染态~态用程序把一枚态态型态作态第状个一态态态个参数IDirect3DDevice9::SetRenderState方法。固定功能态点态理由IDirect3DDevice9::SetRenderState方法和以下态态渲染态控制。态些状控制中的大多在使用可态程态点着色器态有任何作用。数没
•D3DRS_SPECULARENABLE
•D3DRS_FOGSTART
•D3DRS_FOGEND
•D3DRS_FOGDENSITY
•D3DRS_RANGEFOGENABLE
•D3DRS_LIGHTING
•D3DRS_AMBIENT
•D3DRS_FOGVERTEXMODE
•D3DRS_COLORVERTEX
•D3DRS_LOCALVIEWER
•D3DRS_NORMALIZENORMALS
•D3DRS_DIFFUSEMATERIALSOURCE
•D3DRS_SPECULARMATERIALSOURCE
•D3DRS_AMBIENTMATERIALSOURCE
•D3DRS_EMISSIVEMATERIALSOURCE
•D3DRS_VERTEXBLEND
另外~固定功能态点态理流水态使用以下方法态置态态、材态和光照。
•IDirect3DDevice9::SetTransform
•IDirect3DDevice9::SetMaterial
•IDirect3DDevice9::SetLight
•IDirect3DDevice9::LightEnable注意 D3DRS_SPECULARENABLE控制像素流水态中态面反射色的加法。D3DRS_FOGSTART~D3DRS_FOGEND和D3DRS_FOGDENSITY控制如何态算态的起点、
态点和像素态的密度。
更多的信息包含在以下主态中。
概述
阿态法混合态状
阿态法态态态状
态境光态状
抗态态态状
剔除态状
深度态存态状
态态状
光照态状
态廓和充态填状
每态点态色态状
态元裁剪态状
着色态状
态存态状
态理态态态状
阿态法混合态状
一态色的阿态法态控制的透明度。用阿态法混合允态把一表面上的态色、材态和态理根据个它启个
透明度混合到一表面上。另个
更多信息态态参阿态法态理混合和态理混合。
C++态用程序使用D3DRS_ALPHABLENDENABLE 渲染态态用阿态法透明混合状启。Microsoft Direct3D API??允态多态态型的阿态法混合。但是~重要的是要注意用态的三态硬件可能不完全支持所有Direct3D提供的混合态。状
已完成的阿态法混合的态型取于决D3DRS_SRCBLEND和D3DRS_DESTBLEND渲染状状将状态。源和目的混合态态成态使用。以下示例代态态示了如何源混合态态置态D3DBLEND_SRCCOLOR目的混合态态置态并将状D3DBLEND_INVSRCCOLOR。// 本例假态d3dDevice态指向IDirect3DDevice9接口的有效指态。
// 态置源混合态。状
d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
// 态置目的混合态。状
// 态置目的混合态。状
d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
改态源和目的混合态可以使物在态态或灰态多的态境中看起像态光物。例如~若态用状体很很来体
程序在态态的态境中建模了火焰~能量态~子束或态似的态光~态可把源和目的混合态都态很离体状
置态D3DBLEND_ONE。
阿态法混合的一态态用是控制三态态景中的光照~也态光照态态。源混合态态置态另称将状
D3DBLEND_ZERO目的混合态态置态并将状D3DBLEND_SRCALPHA~根据源的阿态法信会
息使态景态暗。源态元被用作光照态态~态态态存中的容态行态放~在适的态候使之态暗~态就是内并当
态色光照态态。
态用程序可以生成彩色光照态态~只要把源阿态法混合态态置态状D3DBLEND_ZERO~把目的并混合态态置态状D3DBLEND_SRCCOLOR。
阿态法态态态状
C++态用程序可以用阿态法态态控制何态把像素被入渲染目态表面。通态态置写
D3DRS_ALPHATESTENABLE渲染态~态用程序态前的状当Direct3D态态根据阿态法态态函态态数每像素。如果态态成功~那态就把像素入表面。如果不成功~那态个写Direct3D就忽略态像素。态用程序通态D3DRS_ALPHAFUNC渲染态态态阿态法态态函。态用程序可以通态状数
D3DRS_ALPHAREF渲染态态置一考阿态法态用和所有像素态行比态。状个参来
阿态法态态常用于在光态化乎透明的物态提高性能。如果正被光态化的态色据比态定像素更几体数
不透明;D3DPCMPCAP_GREATEREQUAL,~那态态像素就被入。否态~光态化器就完全写
忽略态像素~态态就态省了态色混合所需要的态理。以下示例代态态态前态态是否支持一态将两个当个
定的比态函~若支持~态态置比态函的~用在渲染态提高性能。数数参数来
// 本示例代态假态pCaps态一D3DCAPS9态~构
// 被先前的一个IDirect3D9::GetDeviceCaps态用充。填
if (pCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL){
dev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
dev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
dev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
}
// 如果不支持比态~那态就照常渲染。唯一的缺点是有性能上的提升。没
并不是所有的硬件都支持全部阿态法态态特性。可以通态态用IDirect3D9::GetDeviceCaps 方法态态态态能力~取回态态能力后~根据希望使用的比态函态态相态数D3DCAPS9 态的构AlphaCmpCaps成态。如果AlphaCmpCaps成态只包含D3DPCMPCAPS_ALWAYS能力或D3DPCMPCAPS_NEVER能力~那态态态程序不支持阿态法态态。
态境光态状
态境光是周态的光~从个来各方向照射而。
有态Microsoft Direct3D??如何使用态境光的信息~态态参直射光态境光与~和光照相态的与数学。C++态用程序态用IDirect3DDevice9::SetRenderState 方法态置态境光的态色~并将
D3DRS_AMBIENT枚态态型态作态第一态入。第个参数个参数二是态色态~默态态态零。
// 本例假态d3dDevice态指向IDirect3DDevice9接口的有效指态。
// 态置态境光
d3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
抗态态态状
抗态态是使屏来幕上的态和态态看起更态平滑的一态方法。Microsoft Direct3D??支持态抗态态方法两,态态抗态态和全抗态态。屏
有态态些技态的更多态态~态态参抗态态。
默态情况下~Direct3D不态行抗态态。态态抗态态需要渲染第二遍~要用态态抗态态~态态把启
D3DRS_EDGEANTIALIAS 渲染态态置态状TRUE~要禁用态态抗态态~态态把D3DRS_EDGEANTIALIAS 态置态FALSE。
要用全抗态态~态态把启屏D3DRS_MULTISAMPLEANTIALIAS渲染态态置态状TRUE。要禁用全抗态态~态态把屏D3DRS_MULTISAMPLEANTIALIAS态置态FALSE。剔除态状
Direct3D渲染态元态剔除会背向用态的态元。
C++态用程序使用D3DRS_CULLMODE 渲染态态置剔除模状它式~可以被态置态D3DCULL 枚态态型的成态。默态情况下~Direct3D把态点逆态态排列的面作态背向面剔除。
以下示例代态描述了态置剔除模式的态程~态里把态点态态态排列的面作态背向面剔除。// 本例假态d3dDevice态指向IDirect3DDevice9接口的有效指态。// 态置剔除态。状
d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
深度态存态状
深度态存是消除态藏态和态藏面的一态方法。默态的情况下~Direct3D不使用深度态存。有态深度态存的概参念~态态深度态存。
C++态用程序用D3DRS_ZENABLE 渲染态更状状新深度态存的态~用D3DZBUFFERTYPE 枚态态型成态指定新的态态。状
若态用程序要阻止Direct3D入深度态存~态可在态用写IDirect3DDevice9::SetRenderState 态用D3DRS_ZWRITEENABLE 枚态态型作态第一~第个参数并将个参数二指定态D3DZB_FALSE。
以下示例代态态示了如何深度态存态态置态用将状启z态存。
// 本例假态d3dDevice态指向IDirect3DDevice9接口的有效指态。// 用启z态存
d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
态用程序也可以使用D3DRS_ZFUNC 渲染态控制状Direct3D用于深度态存的比态函。数Z偏移是把一表面态示在一表面之前的一态方法~使态的深度态相同。可以个另个即它将此技态用于多态效果。一常用的例子是在态上渲染个影子~影子和态具有相同的深度态~但是态用程序希望把影子态示在态上~只要态影子态一个z偏移态就可以态Direct3D正确它参地态示态;态态D3DRS_ZBIAS,。
态态状
态效果可以态予三态态景更强的态真减清晰感。态效果不态可以用于模态态~也能少态态态景的度。态反映了态真况体离它世界中的情~物用态越态~态的态态就越模糊。
有态如何在态用程序中使用态的更多信息~态态参态。
C++态用程序通态态态渲染态控制态。状D3DRENDERSTATETYPE 枚态态型包括态多态~控制态用状程序使用的是像素;态表,态态是态点态~态是何态色~找参数系态使用的态的公式~及公式的。可以通态将D3DRS_FOGENABLE 渲染态态置态状TRUE用态。态的态色可以使用启
D3DRS_FOGCOLOR 渲染态态置态指定态色~态的态色的阿态法状分量被忽略。
D3DRS_FOGTABLEMODE 和D3DRS_FOGVERTEXMODE 渲染态控制态态算使用的状公式~它两个状态也态接控制使用何态态型的态。态渲染态都可以被态置态D3FOGMODE 枚态态型的成态。将任何一渲染态态置态个状D3DFOG_NONE相态地禁用像素态或态点态。如果渲染态都被态置两个状态有效的模式~态系态只用像素态。启
D3DRS_FOGSTART 和D3DRS_FOGEND 渲染态控制状D3DFOG_LINEAR模式下态公式的参数。D3DRS_FOGDENSITY 渲染态控制指态模状数式下态的密度。
更多信息态态参态的参数。
光照态状
使用Microsoft Direct3D??几启何流水态的态用程序可以用或禁用光照态算。只有包含态点法向的态点才能正确将没地态算光照~不含法向的态点在所有光照态算中使用零点态~因此有法向的态点得不到光照。
更多信息态态参光照的数学。
态用程序通态将D3DRS_LIGHTING 渲染态态置态状TRUE用启Direct3D光照~态是默态的态置~态用程序通态态渲染态态置态将状FALSE禁用Direct3D光照。
光照渲染态态可以态态点态存中的态点态行的光照态算完全状与无态。在态行态点态理态IDirect3DDevice9::ProcessVertices 方法接收自己的态志用于控制光照态算。态廓和充态填状
没会它有态理的态元使用态的材态指定的态色态行渲染~或者如果态态点指定了态色~就使用态点色。可以将D3DRS_FILLMODE 渲染态指定态状D3DFILLMODE 枚态态型的态以态态充态元的方法填。
要用态~态用程序启抖必态把D3DRS_DITHERENABLE 枚态态型态作态第一态态个参数IDirect3DDevice9::SetRenderState~把第并个参数二态置态TRUE~把第二个参数态置态FALSE态禁用态。抖
有态~一态中的画条个与叠最后一像素可能态致周态态元的重。可以使用D3DRS_LASTPIXEL枚态态控制态态情况个况。但是~未态深思熟态最好不要改态态态置。在有些情下~禁止渲染最后一个会像素可能态致态元之态的态隙。
通态态置适的态模当画画体画状式可以物的态廓。默态的态态是态态。更多信息态态态画参 Direct3D 态展
; D3DX ,态段态制渲染态。状
每态点态色态状
当使用态性态点格式;FVF,态态态~态点可以同态包含态点态色和态点法向的信息。默态情况下~ Microsoft? Direct3D?在态算光照态使用态些信息。要态置是否把态点态色用于光照态算~态态态用IDirect3DDevice9::SetRenderState 方法~把D3DRS_COLORVERTEX 作态第一~个参数把第二个参数态置态FALSE禁用态点态色光照~或TRUE启用之。
若每态点态色被用~态态用程序可以启从配置系态何态取得源态点态色信息。
D3DRS_AMBIENTMATERIALSOURCE~D3DRS_DIFFUSEMATERIALSOURCE~D3DRS_EMISSIVEMATERIALSOURCE 和D3DRS_SPECULARMATERIALSOURCE 渲染态控制状相态态境反射色、漫反射色、放射色和态面反射态色成态的源。每态可以被态置态来个状
D3DMATERIALCOLORSOURCE 枚态态型的成态~态枚态态型定态了一些常~通数知系态是使用当来前材态的态色、态点的漫反射态色态是态点的态面反射态色作态指定态色成态的源。态元裁剪态状
如果态元的一部分位于态外~那态区Microsoft? Direct3D?可以态此态态元态行裁剪。在C++态用程序中~Direct3D裁剪由D3DRS_CLIPPING 渲染态控制。可以态渲染态态置态状将状TRUE;默态态,用态元裁剪~或之态置态启将FALSE禁用Direct3D裁剪服态。
着色态状
Direct3D同态支持平面和高洛德着色~默态情况当下使用高洛德着色。要控制前的着色模式~C++态用程序可以态D3DRS_SHADEMODE 渲染态指定一状个D3DSHADEMODE 枚态态型态。以下C++示例代态态示了把着色态态置态状平面着色模式的态程。
// 本例假态d3dDevice态指向IDirect3DDevice9接口的有效指态。// 态置着色模式。
d3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
模板态存态状
态用程序使用模板态存定是否把一像素入到渲染目态表面。决个写
态态态态参模板态存技态。
C++态用程序通态态用IDirect3DDevice9::SetRenderState 方法用或启将禁用模板态存~态态D3DRS_STENCILENABLE 作态第一的态~相态个参数并个参数地把第二态置态TRUE或FALSE用或启禁用模板态存。
通态态用IDirect3DDevice9::SetRenderState~可以态置Microsoft Direct3D??态行模板态态态使用的比态函~只需第一的态态置态数将个参数D3DRS_STENCILFUNC~把并D3DCMPFUNC 枚态态型态作态第二个参数的态态入。
模板考态是在模板态存中的态~模板函用态行态态。参数它况参默态情下~模板考态态零。态用程序可以态用IDirect3DDevice9::SetRenderState 态置的态~只需它将D3DRS_STENCILREF 作态第一态入~把第个参数并个参数参二的态态置态新的考态。
Direct3D在态每像素态行模板态态前~态模板考态和模板个会参与并掩态态态行按位操作~把得到的态果用模板比态函模板态存的容态行比态。态用程序可以态用数与内
IDirect3DDevice9::SetRenderState 态置模板掩态态~只需将D3DRS_STENCILMASK 作态第一个参数并个参数态入~把第二态置态新的模板掩态态。
要态置模板态态失态态Direct3D采取的行态~可以态用IDirect3DDevice9::SetRenderState并将D3DRS_STENCILFAIL 作态第一态入~第个参数个参数二必态被态态D3DSTENCILCAPS 枚态态型的成态。
态用程序也可以控制模板态态通态但是当z态存态态失态态Direct3D如何态~只需态用响
IDirect3DDevice9::SetRenderState~将D3DRS_STENCILZFAIL 作态第一态态~个参数并把第二个参数态态D3DSTENCILCAPS枚态态型的成态。
另当外~态用程序态可以控制模板态态和z态存态态都通态态Direct3D做什态~只需态用IDirect3DDevice9::SetRenderState并将D3DRS_STENCILPASS 作态第一~把个参数并第二个参数态态D3DSTENCILCAPS枚态态型的成态。
写将写写掩态可以用于修改要入模板态存的态。要态置模板态存掩态~只需态用IDirect3DDevice9::SetRenderState~并将D3DRS_STENCILWRITEMASK 作态第一个参数并个参数写态态~把第二态态态掩态的态。
态理态态态状
D3DRS_WRAP0 到D3DRS_WRAP7 渲染态态用或状启禁用态态的多重态理态态中各态态理的u和v态态。可以把态些渲染态态置态态状志
D3DWRAPCOORD_0~D3DWRAPCOORD_1~D3DWRAPCOORD_2和D3DWARPCOORD_3的态合~相态地启个用态理在第一、第二、第三和第四方向上的态态~若使用零态~态禁用所有态态。默态情况下~所有态理的所有方向上的态理态态都被禁用。有态的概参念态述态态态理态态。
取态器态状
取态态控制态如态态、状tiling及态址等与取态有态的操作。
取态态状
SetSamplerState态置取态器态;包状括tessellator中态位移态态态行取态的态,~态了能态在态态态态态状
出正在移植Microsoft? DirectX? 8.x的态用程序~态些态已态被重状并新命名以D3DSAMP_前态态态。态些态包状括,
•D3DSAMP_ADDRESSU, D3DSAMP_ADDRESSV, D3DSAMP_ADDRESSW
•D3DSAMP_BORDERCOLOR
•D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER, D3DSAMP_MIPFILTER
•D3DSAMP_MIPMAPLODBIAS
•D3DSAMP_MAXMIPLEVEL
•D3DSAMP_MAXANISOTROPY
在DirectX 9.0中~使用像素着色器2.0版态~态然态理坐态的量数仍被限制态8个趟~但每一最多可以支持16个状与与与态理表面。有些态理态态表面相态~有些坐态集相态~有些态态点态理相态~而有些态像素态理相态。与IDirect3DDevice9::SetSamplerState 方法可以指定态理态态、平态、截取、MIPLOD等状态~最多可以有16个取态器。
C++态用程序通态态用IDirect3DDevice9::SetSamplerState方法控制态理有态的取态态与状。D3DSAMPLERSTATETYPE 枚态态型用于指定取态态。状
相态主态
• 态理态态状
态理态态状
态理态态控制态理状状坐态的生成及态理坐态的态~如态态模式。
C++态用程序通态态用IDirect3DDevice9::SetTextureStageState 方法控制态理有态的态与状。D3DTEXTURESTAGESTATETYPE 枚态态型定态了所有态理有态的渲染态~态用程序态态与状将
D3DTEXTURESTAGESTATETYPE枚态态型态作态第一态态态个参数
IDirect3DDevice9::SetTextureStageState方法。
态用程序可以通态态用IDirect3DDevice9::SetTexture 方法态置某一态的态理。
SetTextureStageStateSetTextureStageState态在可以态置以下态。状
•固定功能态点态理态。态些态控制态态理状状坐态的操控,
D3DTSS_TEXTURETRANSFORMFLAGS和 D3DTSS_TEXCOORDINDEX。最多
可以态置八个;因态Direct3D态是支持八态态理坐态,
•固定功能像素着色器态;以前的状TextureStageState,。D3DTSS_COLOROP,
D3DTSS_ALPHAOP, D3DTSS_COLORARG0, D3DTSS_COLORARG1,
D3DTSS_COLORARG2, D3DTSS_ALPHAARG0, D3DTSS_ALPHAARG1,
D3DTSS_ALPHAARG2, D3DTSS_BUMPENVMAT00,
D3DTSS_BUMPENVMAT01, D3DTSS_BUMPENVMAT10,
D3DTSS_BUMPENVMAT11, D3DTSS_BUMPENVLSCALE,
D3DTSS_BUMPENVLOFFSET, and D3DTSS_RESULTARG。态些态状最多可有
MaxTextureBlendStages态可供态置。
D3DTSS_TEXCOORDINDEX是一固定功能态点态理态。如果使用可态程态点着色器~那态个状
态态被忽略。个状
态用程序可以使用的态理取态器的量由像素着色器的数决版本定。
•固定功能像素着色器,MaxTextureBlendStages/MaxSimultaneousTextures态理取态个
器
•ps.1.1到ps.1.3: 4个态理取态器。
•ps.1.4,6个态理取态器。
•ps.2.0,16个态理取态器。
•支持Microsoft DirectX? 9.0位移态态的态态支持一态外的取态器将个
;D3DDMAPSAMPLER,~在它tesselator态位移态态态行取态。
有态更多态理混合的信息~态态参态理混合。
状态态
一态态是一态态态态、渲染态、光照和材态的、态态态、态理态态和前态理信息。态态个状状状参数状状当状
是态态前态的一态态~或当状个来独者是被态式地态态下的。可以通态态的一次态用把态态态用于态态。渲染态态可以态化态态态态以加状状另状速态用程序所要求的一般态序的态改态。外~态态态态也可以使改态态态态更态方状便。
C++态用程序可以在态用IDirect3DDevice9::EndStateBlock 方法态束态态一态态~以个状及态用IDirect3DDevice9::CreateStateBlock 方法保存一态态定态的态态态据态~状数个状得到一态态句柄。更多信息包含在以下主态中。
概述
态建态定态的态态状
态态态态状
态建态定态的态态状
IDirect3DDevice9::CreateStateBlock 方法态建一个状它状与新的态态~包含全部的态态态或是态态点或像素态理相态的态态态。状IDirect3DDevice9::CreateStateBlock方法接收两个参数~第一个参数状状个参数代表要在新的态态中态态的态信息的态型~第二是返回句柄的地址~用于接收当状态用成功态返回的有效态态的句柄。
第一态个参数D3DSTATEBLOCKTYPE 枚态态型~可以以下三态态态从,
•保存态点和像素态。状
•只保存态点态。状
•只保存像素态。状
要了解可以保存的态的全部状参列表~态态D3DSTATEBLOCKTYPE。
一定要态态IDirect3DDevice9::CreateStateBlock方法的态态代态~如果态方法失态~可能很是态示模式改态了。态了从状此态失态中恢态~态用程序态态重新态建表面~然后重新态建态态。态态态态状
IDirect3DDevice9 接口提供IDirect3DDevice9::BeginStateBlock 方法~在态用程序态置态态态态状~态方法把态态态到一态态中。态方法使会它个状状个状将它系态态始把态态态的改态态态到一态态中~而不是态;新的态态态,态用于态态。可被态态的态状状参列表态态IDirect3DDevice9::BeginStateBlock。当状态用程序完成态态态的态态后~态态态用IDirect3DDevice9::EndStateBlock 方法通知系态以态束态态。态方法返回一态态的个状将状句柄~态用程序态态接收态态句柄的态量的地址作态pToken参数态入。态用程序可以根据需要用态个状状数句柄态用态态态~态态新的态据到态态中~以状状及在不再需要态态态态态之态除。将
一定要态态IDirect3DDevice9::EndStateBlock方法的态态代态~如果态方法失态~可能是很因
态态示模式改态了。态态合理地态态态用程序~使之能态从并此态失态中恢态~只要重新态建表面再次态态
状达个态态就可以到态目的。