D3D文档——状态和状态块

网上搜了一下,发现没有状态块的介绍,因此用自己拙劣的英文水平翻译了一下,欢迎指正。 

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_MINTESSELLATIONLEVEL
1
D3DRS_MAXTESSELLATIONLEVEL
1
D3DRS_ADAPTIVETESS_X
0
D3DRS_ADAPTIVETESS_Y
0
D3DRS_ADAPTIVETESS_Z
1
D3DRS_ADAPTIVETESS_W
0
D3DRS_ENABLEADAPTIVETESSELLATION"/>
FALSE

顶点流水线:采样状态

采样状态控制与采样相关的话题,例如过滤,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值