一个state就是对(固定)渲染管线的某个特性或参数的一次设置
state block 记录了一个序列很多的state,可以保存相似的一连串对管线的设置
4.0.1创建state block
1.创建一个State Block并将当前state加入
IDirect3DDevice9::CreateStateBlock()
2.自动的捕捉一短时间的state变化
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->BeginStateBlock();
。。。
pd3dDevice->EndStateBlock( &pStateBlock );
3.stateblock的操作
Aply 它可以将这段state作用于当前的设备,(注意当前设备中的这段state里没有捕捉的值不会被改变)
capture:捕捉当前设备中那些存在域这个stateblock里的值的state
GetDevice:获取设备
4.1 state的种类
Vertex state
Pixel state
Each texture assigned to a sampler
Each vertex texture
Each displacement map texture
The current texture palette
A pointer to the index buffer
The viewport
The scissors rectangle
The world, view, and projection matrices
The texture transforms
The clipping planes
The current material
IDirect3DDevice9::BeginStateBlock后记录的操作
IDirect3DDevice9::SetClipPlane
IDirect3DDevice9::SetCurrentTexturePalette
IDirect3DDevice9::SetNPatchMode
IDirect3DDevice9::SetPixelShader
IDirect3DDevice9::SetPixelShaderConstantB
IDirect3DDevice9::SetPixelShaderConstantF
IDirect3DDevice9::SetPixelShaderConstantI
IDirect3DDevice9::SetRenderState
IDirect3DDevice9::SetSamplerState
IDirect3DDevice9::SetScissorRect
IDirect3DDevice9::SetStreamSource
IDirect3DDevice9::SetStreamSourceFreq
IDirect3DDevice9::SetTextureStageState
IDirect3DDevice9::SetTransform
IDirect3DDevice9::SetVertexDeclaration
IDirect3DDevice9::SetVertexShader
IDirect3DDevice9::SetVertexShaderConstantB
IDirect3DDevice9::SetVertexShaderConstantF
IDirect3DDevice9::SetVertexShaderConstantI
4.2设置state
vertex 管线的
IDirect3DDevice9::SetRenderState.渲染状态
state名称 | 默认值 | 备注 |
D3DRS_CULLMODE | D3DCULL_CCW | Backface cull |
D3DRS_FOGCOLOR | 0 | 雾颜色 |
D3DRS_FOGTABLEMODE | D3DFOG_NONE | pixel雾的计算方法(线性 一次两次) |
D3DRS_FOGSTART | 0 | 雾参数 |
D3DRS_FOGEND | 1 |
|
D3DRS_FOGDENSITY | 1 |
|
D3DRS_RANGEFOGENABLE | FALSE |
|
D3DRS_AMBIENT | 0 | 环境光颜色 |
D3DRS_COLORVERTEX | TRUE | 是否允许指定每个顶点颜色(默认的) |
D3DRS_FOGVERTEXMODE | D3DFOG_NONE | vertex雾的计算方法 |
D3DRS_CLIPPING | TRUE | 允许剪裁 |
D3DRS_LIGHTING | TRUE | 开启光照 |
D3DRS_LOCALVIEWER | TRUE | 摄像机相关的光照,如果用正交投影 那么要false |
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 | A float value that specifies the size to use for point size computation in cases where point size is not specified for each vertex |
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 | 在面片边缘处的tesselation采用什么方法(比如是否是浮点数,这将使边缘平滑),默认整数 |
D3DRS_POINTSIZE_MAX | 1 |
|
D3DRS_INDEXEDVERTEXBLENDENABLE | FALSE |
|
D3DRS_TWEENFACTOR | 0 |
|
D3DDEGREE_CUBIC |
| |
D3DRS_NORMALDEGREE | D3DDEGREE_LINEAR |
|
1 | Tesselation参数 | |
D3DRS_MAXTESSELLATIONLEVEL | 1 |
|
0 |
| |
D3DRS_ADAPTIVETESS_Y | 0 |
|
D3DRS_ADAPTIVETESS_Z | 1 |
|
D3DRS_ADAPTIVETESS_W | 0 |
|
IDirect3DDevice9::SetSamplerState纹理采样状态
只有这一个可设D3DSAMP_DMAPOFFSET
IDirect3DDevice9::SetTexture把一个纹理绑定到管线的设置
IDirect3DDevice9::SetTextureStageState设置当前绑定纹理的状态值
pixel 管线的
IDirect3DDevice9::SetRenderState.渲染状态
D3DRS_ZENABLE | D3DZB_FALSE |
| 使用zbuffer |
D3DRS_SPECULARENABLE | FALSE |
| 使用高光反射 |
D3DFILLMODE | D3DFILL_SOLID |
| 面的填充模式 |
D3DSHADEMODE | D3DSHADE_GOURAUD |
| 渲染模式(目前只有flat和gouraud) |
D3DRS_ZWRITEENABLE | TRUE |
| Depth buffer是否可写,注意这个不影响depthbuffer的比较操作 |
D3DRS_ALPHATESTENABLE | FALSE |
| Alpha 测试(镂空) |
D3DRS_LASTPIXEL | TRUE |
| 画最后一个pixel为一条线 |
D3DRS_SRCBLEND | D3DBLEND_ONE |
| 两个混合参数的来源 |
D3DRS_DESTBLEND | D3DBLEND_ZERO |
|
|
D3DRS_ZFUNC | D3DCMP_LESSEQUAL |
| 深度测试的比较函数 |
D3DRS_ALPHAREF | 0 |
| Alpha测试的基准参数 |
D3DRS_ALPHAFUNC | D3DCMP_ALWAYS |
| Alpha测试的比较函数 |
D3DRS_DITHERENABLE | FALSE |
| 是否开启dithering |
D3DRS_FOGSTART | 0 |
| Fog参数 |
D3DRS_FOGEND | 1 |
|
|
D3DRS_FOGDENSITY | 1 |
|
|
D3DRS_ALPHABLENDENABLE | FALSE |
| 开启Alpha混合 |
0 |
| 深度偏移值,用于区分在一个平面的两个物体的前后 | |
D3DRS_STENCILENABLE | FALSE |
| 开启stencil 缓存 |
D3DRS_STENCILFAIL | D3DSTENCILOP_KEEP |
| Stencil参数(常用于溶解 贴花 描边) |
D3DRS_STENCILZFAIL | D3DSTENCILOP_KEEP |
|
|
D3DRS_STENCILPASS | D3DSTENCILOP_KEEP |
|
|
D3DRS_STENCILFUNC | D3DCMP_ALWAYS |
|
|
D3DRS_STENCILREF | 0 |
|
|
D3DRS_STENCILMASK | 0xffffffff |
|
|
D3DRS_STENCILWRITEMASK | 0xffffffff |
|
|
D3DRS_TEXTUREFACTOR | 0xffffffff |
|
|
D3DRS_WRAP0 | 0 |
|
|
D3DRS_WRAP1 | 0 |
|
|
D3DRS_WRAP2 | 0 |
|
|
D3DRS_WRAP3 | 0 |
|
|
D3DRS_WRAP4 | 0 |
|
|
D3DRS_WRAP5 | 0 |
|
|
D3DRS_WRAP6 | 0 |
|
|
D3DRS_WRAP7 | 0 |
|
|
D3DRS_WRAP8 | 0 |
|
|
D3DRS_WRAP9 | 0 |
|
|
D3DRS_WRAP10 | 0 |
|
|
D3DRS_WRAP11 | 0 |
|
|
D3DRS_WRAP12 | 0 |
|
|
D3DRS_WRAP13 | 0 |
|
|
D3DRS_WRAP14 | 0 |
|
|
D3DRS_WRAP15 | 0 |
|
|
D3DRS_LOCALVIEWER | TRUE |
|
|
D3DRS_EMISSIVEMATERIALSOURCE | D3DMCS_MATERIAL |
| 材质指令 |
D3DRS_AMBIENTMATERIALSOURCE | D3DMCS_MATERIAL |
|
|
D3DRS_DIFFUSEMATERIALSOURCE | D3DMCS_COLOR1 |
|
|
D3DRS_SPECULARMATERIALSOURCE | D3DMCS_COLOR2 |
|
|
D3DRS_COLORWRITEENABLE | 0x0000000f |
|
|
D3DBLENDOP | D3DBLENDOP_ADD |
| 混合方式 |
D3DRS_SCISSORTESTENABLE | FALSE |
| 开启SCISSORTEST |
D3DRS_SLOPESCALEDEPTHBIAS | 0 |
| 深度偏移的一个参数 |
D3DRS_ANTIALIASEDLINEENABLE | FALSE |
| 开启对线的反走样 |
D3DRS_TWOSIDEDSTENCILMODE | FALSE |
| 双面的stencil模式 |
D3DRS_CCW_STENCILFAIL | D3DSTENCILOP_KEEP |
|
|
D3DRS_CCW_STENCILZFAIL | D3DSTENCILOP_KEEP |
|
|
D3DRS_CCW_STENCILPASS | D3DSTENCILOP_KEEP |
|
|
D3DRS_CCW_STENCILFUNC | D3DCMP_ALWAYS |
|
|
D3DRS_COLORWRITEENABLE1 | 0x0000000f |
|
|
D3DRS_COLORWRITEENABLE2 | 0x0000000f |
|
|
D3DRS_COLORWRITEENABLE3 | 0x0000000f |
|
|
D3DRS_BLENDFACTOR | 0xffffffff |
|
|
D3DRS_SRGBWRITEENABLE | 0 |
|
|
D3DRS_SEPARATEALPHABLENDENABLE | FALSE |
| 为alpha通道做独立的混合操作 |
D3DRS_SRCBLENDALPHA | D3DBLEND_ONE |
| Alpha混合的相关操作 |
D3DRS_DESTBLENDALPHA | D3DBLEND_ZERO |
|
|
D3DRS_BLENDOPALPHA | D3DBLENDOP_ADD |
|
|
IDirect3DDevice9::SetSamplerState纹理采样设置
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 |
IDirect3DDevice9::SetTexture把一个纹理绑定到管线的设置
IDirect3DDevice9::SetTextureStageState设置当前绑定纹理的状态值
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 |
|