今天解决D3D与GFX渲染冲突问题。
以下转载,仅供参考
Direct3D设备使用状态来设定所有流水线处理。通过设定纹理寻址和过滤模式,状态可以控制纹理。纹理状态(Texture states)可以用来控制多纹理如何互相被组织和混合。渲染状态可以控制大多数的流水线状态。
Microsoft® Direct3D®设备是一个状态机。应用程序设置光照、渲染和变换模块的状态,然后在渲染时传递数据给它们。
--------------------------------------------------------------------------------
用状态块来保存和恢复状态
--------------------------------------------------------------------------------
状态块是一组设备的状态。设备状态是由渲染状态,顶点状态,像素状态组成的。一个状态块包含了设备的当前状态的快照,或者你可以创建一个记录块,这个状态块记录着每个由你的应用程序触发的状态改变。
--------------------------------------------------------------------------------
创建状态块
--------------------------------------------------------------------------------
选择你想要捕获的状态类型,然后创建一个像这样的状态块:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->CreateStateBlock( D3DSBT_ALL, &pStateBlock );
CreateStateBlock 创建一个状态块,并且捕获设备状态。设备状态由第一个参数中的状态块类型来指定。这个状态可以是以下几种之一:
All device state (参考使用状态保存块保存所有状态).
All pixel state (参考使用状态保存块保存像素状态).
All vertex state (参考使用状态保存块保存顶点状态).
--------------------------------------------------------------------------------
设定捕获状态的信息
--------------------------------------------------------------------------------
创建一个自动捕获当前设备状态的状态块。effect系统使用一个状态块来保存状态。在Begin函数被调用后,一个状态块就会被创建,状态就会被捕获。当End函数被调用时,状态块就被再应用到设备。
要保存一个自定义的状态链,将状态打包放在你想要保存的BeginSataeBlock和EndStateBlock对中。BeginStateBlock让当前设备要创建一个状态块,并且在状态变换发生时将它添加到这个块中,直到EndStateBlock被调用为止。这里有个例子:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->BeginStateBlock();
// Any number of state changes can occur here
// SetRenderState, SetSamplerState, SetTextureStageState ...
pd3dDevice->EndStateBlock( &pStateBlock );
这会将以任何顺序出现的任何数目的状态改变保存到自定义状态块中。稍后,当你想要使用状态块来重设设备状态时,调用Apply函数。这只会覆盖那些被捕获在状态块内的设备状态。任何其他没有被捕获在状态块内的设备状态不会被改变。再者,因为状态块对象是一个借口,在用完之后你必须释放它。
--------------------------------------------------------------------------------
使用状态保存块保存所有状态
--------------------------------------------------------------------------------
一个状态块可以用来保存所有设备的状态。设备状态包含下列的设备元素:
顶点状态
像素状态
每个被赋给采样器(Sampler)的纹理
每个顶点纹理
每个置换映射纹理
当前纹理的调色板
对于每个顶点流:一个顶点缓冲的指针,SetStreamSource的每个参数,来自SetStreamSourceFreq的分割(如果有的话)
一个索引缓冲的指针
视角
剪裁窗口
世界矩阵,视角矩阵,投影矩阵
纹理变换
剪切平面(如果有的话)
当前材质
要使用状态块来捕获所有设备状态,在调用CreateStateBlock的时候指定D3DSBT_ALL参数。
--------------------------------------------------------------------------------
使用状态保存块保存顶点状态
--------------------------------------------------------------------------------
状态块可以用来仅捕获顶点状态。下列的状态为顶点状态。
顶点渲染状态
采样状态
顶点纹理状态
来自SetNPatchMode的NPatch模式块
来自SetLigth的每个光照,以及光照是否Enable的LightEnalbe
当前顶点着色器和每个着色器的常量
为每个顶点流保存的,来自SetStreamSourceFreq的分割值
当前顶点定义
要使用状态块来捕获顶点状态,在调用CreateStateBlock的时候指定D3DSBT_ VERTEXSTATE参数。
--------------------------------------------------------------------------------
顶点流水线:渲染状态
--------------------------------------------------------------------------------
设备渲染状态几乎影响流水线的所有部分。渲染状态可以调用SetRenderState来设定。
下表包含了所有设定顶点状态的渲染状态
Render States Default Value
D3DRS_CULLMODE D3DCULL_CCW
D3DRS_FOGCOLOR 0
D3DRS_FOGTABLEMODE D3DFOG_NONE
D3DRS_FOGSTART 0
D3DRS_FOGEND 1
D3DRS_FOGDENSITY 1
D3DRS_RANGEFOGENABLE FALSE
D3DRS_AMBIENT 0
D3DRS_COLORVERTEX TRUE
D3DRS_FOGVERTEXMODE D3DFOG_NONE
D3DRS_CLIPPING TRUE
D3DRS_LIGHTING TRUE
D3DRS_LOCALVIEWER TRUE
D3DRS_EMISSIVEMATERIALSOURCE D3DMCS_MATERIAL
D3DRS_AMBIENTMATERIALSOURCE D3DMCS_MATERIAL
D3DRS_DIFFUSEMATERIALSOURCE D3DMCS_COLOR1
D3DRS_SPECULARMATERIALSOURCE D3DMCS_COLOR2
D3DRS_VERTEXBLEND D3DVBF_DISABLE
D3DRS_CLIPPLANEENABLE 0
D3DRS_POINTSIZE Driver dependent
D3DRS_POINTSIZE_MIN 1
D3DRS_POINTSPRITEENABLE FALSE
D3DRS_POINTSCALEENABLE FALSE
D3DRS_POINTSCALE_A 1
D3DRS_POINTSCALE_B 0
D3DRS_POINTSCALE_C 0
D3DRS_MULTISAMPLEANTIALIAS TRUE
D3DRS_MULTISAMPLEMASK 0xffffffff
D3DRS_PATCHEDGESTYLE D3DPATCHEDGE_DISCRETE
D3DRS_POINTSIZE_MAX 1
D3DRS_INDEXEDVERTEXBLENDENABLE FALSE
D3DRS_TWEENFACTOR 0
D3DRS_POSITIONDEGREE D3DDEGREE_CUBIC
D3DRS_NORMALDEGREE D3DDEGREE_LINEAR
D3DRS_MINTESSE
--------------------------------------------------------------------------------
顶点流水线:采样状态
--------------------------------------------------------------------------------
采样状态控制与采样相关的话题,例如过滤,tiling,纹理坐标寻址模式。使用SetSamplerState来设定采样状态(包括用tessellator单元来对displacement map采样的)。采样器状态带有D3DSAMP_前缀,以便在编译的时候检测从DirectX 8代码带来的错误。
Sampler States Default Value
D3DSAMP_ADDRESSU D3DTADDRESS_WRAP
D3DSAMP_ADDRESSV D3DTADDRESS_WRAP
D3DSAMP_ADDRESSW D3DTADDRESS_WRAP
D3DSAMP_BORDERCOLOR 0x00000000
D3DSAMP_MAGFILTER D3DTEXF_POINT
D3DSAMP_MINFILTER D3DTEXF_POINT
D3DSAMP_MIPFILTER D3DTEXF_NONE
D3DSAMP_MIPMAPLODBIAS 0
D3DSAMP_MAXMIPLEVEL 0
D3DSAMP_MAXANISOTROPY 1
D3DSAMP_SRGBTEXTURE 0
D3DSAMP_ELEMENTINDEX 0
--------------------------------------------------------------------------------
顶点流水线:纹理状态
--------------------------------------------------------------------------------
纹理状态控制多纹理的混合操作。使用SetTexturStateState来设定纹理阶段状态。使用SetTexture将纹理和采样阶段绑定。
下表包含了所有设定像素状态的纹理状态
Texture States Default Value
D3DTSS_COLOROP D3DTOP_DISABLE
D3DTSS_COLORARG1 D3DTA_TEXTURE
D3DTSS_COLORARG2 D3DTA_CURRENT
D3DTSS_ALPHAOP D3DTOP_DISABLE
D3DTSS_ALPHAARG1 D3DTA_TEXTURE
D3DTSS_ALPHAARG2 D3DTA_CURRENT
D3DTSS_BUMPENVMAT00 0
D3DTSS_BUMPENVMAT01 0
D3DTSS_BUMPENVMAT10 0
D3DTSS_BUMPENVMAT11 0
D3DTSS_TEXCOORDINDEX 0
D3DTSS_BUMPENVLSCALE 0
D3DTSS_BUMPENVLOFFSET 0
D3DTSS_TEXTURETRANSFORMFLAGS D3DTTFF_DISABLE
D3DTSS_COLORARG0 D3DTA_CURRENT
D3DTSS_ALPHAARG0 D3DTA_CURRENT
D3DTSS_RESULTARG D3DTA_CURRENT