SetRenderState 渲染状态是Direct3D中比较核心的方法,控制着3D渲染管线的各种行为(深度测试,混合模式,光照开关等),它枚举比较多也不容易理解。
SetRenderState 函数详解
HRESULT SetRenderState (
D3DRENDERSTATETYPE State, // 要设置的渲染状态类型(枚举值)
DWORD Value // 该状态的具体值
);
SetRenderState函数最重要的就是D3DRENDERSTATETYPE State这个枚举,类型太多。
D3DRENDERSTATETYPE 相关枚举解释
typedef enum _D3DRENDERSTATETYPE {
D3DRS_ZENABLE = 7, /* 深度缓冲区启用状态(取值为 D3DZBUFFERTYPE 枚举,或兼容旧版的 TRUE/FALSE) */
D3DRS_FILLMODE = 8, /* 多边形填充模式(取值为 D3DFILLMODE 枚举,如实心、线框) */
D3DRS_SHADEMODE = 9, /* 着色模式(取值为 D3DSHADEMODE 枚举,如平面着色、高洛德着色) */
D3DRS_ZWRITEENABLE = 14, /* 深度写入启用状态(TRUE 表示允许向深度缓冲区写入数据) */
D3DRS_ALPHATESTENABLE = 15, /* Alpha 测试启用状态(TRUE 表示启用 Alpha 测试,过滤透明像素) */
D3DRS_LASTPIXEL = 16, /* 线段端点绘制控制(TRUE 表示绘制线段的最后一个像素) */
D3DRS_SRCBLEND = 19, /* 源混合因子(取值为 D3DBLEND 枚举,控制当前绘制像素的混合权重) */
D3DRS_DESTBLEND = 20, /* 目标混合因子(取值为 D3DBLEND 枚举,控制缓冲区中已有像素的混合权重) */
D3DRS_CULLMODE = 22, /* 多边形剔除模式(取值为 D3DCULL 枚举,如剔除顺时针/逆时针面) */
D3DRS_ZFUNC = 23, /* 深度比较函数(取值为 D3DCMPFUNC 枚举,如"小于等于"则通过测试) */
D3DRS_ALPHAREF = 24, /* Alpha 测试参考值(D3DFIXED 类型,用于与像素 Alpha 值比较) */
D3DRS_ALPHAFUNC = 25, /* Alpha 比较函数(取值为 D3DCMPFUNC 枚举,如"大于参考值"则显示像素) */
D3DRS_DITHERENABLE = 26, /* 抖动启用状态(TRUE 表示启用抖动,减少颜色量化误差) */
D3DRS_ALPHABLENDENABLE = 27, /* Alpha 混合启用状态(TRUE 表示启用颜色混合,实现半透明效果) */
D3DRS_FOGENABLE = 28, /* 雾效启用状态(TRUE 表示启用雾效,模拟远景模糊) */
D3DRS_SPECULARENABLE = 29, /* 镜面光启用状态(TRUE 表示启用镜面高光效果) */
D3DRS_FOGCOLOR = 34, /* 雾效颜色(D3DCOLOR 类型,定义雾的颜色) */
D3DRS_FOGTABLEMODE = 35, /* 表格雾模式(取值为 D3DFOGMODE 枚举,基于预计算表格的雾效算法) */
D3DRS_FOGSTART = 36, /* 雾效起始距离(顶点雾与像素雾共用,定义雾开始生效的距离) */
D3DRS_FOGEND = 37, /* 雾效结束距离(定义雾完全覆盖物体的距离) */
D3DRS_FOGDENSITY = 38, /* 雾效浓度(用于指数雾模式,值越大雾越浓) */
D3DRS_RANGEFOGENABLE = 48, /* 范围雾启用状态(TRUE 表示启用基于视距的范围雾) */
D3DRS_STENCILENABLE = 52, /* 模板测试启用状态(BOOL 类型,TRUE 表示启用模板缓冲) */
D3DRS_STENCILFAIL = 53, /* 模板测试失败时的操作(取值为 D3DSTENCILOP 枚举,如"保持模板值") */
D3DRS_STENCILZFAIL = 54, /* 模板测试通过但深度测试失败时的操作(取值为 D3DSTENCILOP 枚举) */
D3DRS_STENCILPASS = 55, /* 模板测试与深度测试均通过时的操作(取值为 D3DSTENCILOP 枚举) */
D3DRS_STENCILFUNC = 56, /* 模板比较函数(取值为 D3DCMPFUNC 枚举,如"参考值等于模板值"则通过) */
D3DRS_STENCILREF = 57, /* 模板测试参考值(用于与模板缓冲中的值比较) */
D3DRS_STENCILMASK = 58, /* 模板测试掩码(比较前与参考值、模板值进行按位与操作) */
D3DRS_STENCILWRITEMASK = 59, /* 模板写入掩码(控制模板值写入时的位屏蔽,如 0xFF 表示全位写入) */
D3DRS_TEXTUREFACTOR = 60, /* 纹理因子(D3DCOLOR 类型,多纹理混合时使用的常量颜色) */
D3DRS_WRAP0 = 128, /* 第 0 组纹理坐标的环绕模式(控制纹理超出 UV 范围时的显示方式) */
D3DRS_WRAP1 = 129, /* 第 1 组纹理坐标的环绕模式 */
D3DRS_WRAP2 = 130, /* 第 2 组纹理坐标的环绕模式 */
D3DRS_WRAP3 = 131, /* 第 3 组纹理坐标的环绕模式 */
D3DRS_WRAP4 = 132, /* 第 4 组纹理坐标的环绕模式 */
D3DRS_WRAP5 = 133, /* 第 5 组纹理坐标的环绕模式 */
D3DRS_WRAP6 = 134, /* 第 6 组纹理坐标的环绕模式 */
D3DRS_WRAP7 = 135, /* 第 7 组纹理坐标的环绕模式 */
D3DRS_CLIPPING = 136, /* 裁剪启用状态(TRUE 表示启用视锥体裁剪,只显示视野内物体) */
D3DRS_LIGHTING = 137, /* 光照启用状态(TRUE 表示启用硬件光照计算,控制物体明暗) */
D3DRS_AMBIENT = 139, /* 环境光颜色(D3DCOLOR 类型,全局基础光照颜色) */
D3DRS_FOGVERTEXMODE = 140, /* 顶点雾模式(取值为 D3DFOGMODE 枚举,基于顶点距离的雾效) */
D3DRS_COLORVERTEX = 141, /* 顶点颜色启用状态(TRUE 表示使用顶点自带颜色,而非材质颜色) */
D3DRS_LOCALVIEWER = 142, /* 本地观察者模式(TRUE 表示使用相机位置计算光照,FALSE 表示使用平行光简化) */
D3DRS_NORMALIZENORMALS = 143, /* 法向量归一化启用状态(TRUE 表示自动归一化法向量,避免缩放导致光照异常) */
D3DRS_DIFFUSEMATERIALSOURCE = 145, /* 漫反射材质来源(取值为 D3DMATERIALSOURCE 枚举,如顶点颜色、材质属性) */
D3DRS_SPECULARMATERIALSOURCE = 146, /* 镜面反射材质来源(取值为 D3DMATERIALSOURCE 枚举) */
D3DRS_AMBIENTMATERIALSOURCE = 147, /* 环境光材质来源(取值为 D3DMATERIALSOURCE 枚举) */
D3DRS_EMISSIVEMATERIALSOURCE = 148, /* 自发光材质来源(取值为 D3DMATERIALSOURCE 枚举,控制物体自发光颜色) */
D3DRS_VERTEXBLEND = 151, /* 顶点混合模式(取值为 D3DVERTEXBLENDFLAGS 枚举,用于骨骼动画等顶点变形) */
D3DRS_CLIPPLANEENABLE = 152, /* 裁剪平面启用状态(控制是否启用用户定义的额外裁剪平面) */
D3DRS_POINTSIZE = 154, /* 点精灵大小(float 类型,定义点图元的显示尺寸) */
D3DRS_POINTSIZE_MIN = 155, /* 点精灵最小尺寸(float 类型,点缩放时的最小阈值) */
D3DRS_POINTSPRITEENABLE = 156, /* 点精灵启用状态(BOOL 类型,TRUE 表示将点渲染为纹理精灵) */
D3DRS_POINTSCALEENABLE = 157, /* 点缩放启用状态(BOOL 类型,TRUE 表示根据距离缩放点大小) */
D3DRS_POINTSCALE_A = 158, /* 点缩放系数 A(float 类型,点大小衰减公式中的系数) */
D3DRS_POINTSCALE_B = 159, /* 点缩放系数 B(float 类型,点大小衰减公式中的系数) */
D3DRS_POINTSCALE_C = 160, /* 点缩放系数 C(float 类型,点大小衰减公式中的系数) */
D3DRS_MULTISAMPLEANTIALIAS = 161, /* 多重采样抗锯齿启用状态(BOOL 类型,TRUE 表示启用全屏抗锯齿) */
D3DRS_MULTISAMPLEMASK = 162, /* 多重采样掩码(DWORD 类型,控制每个采样点是否参与抗锯齿) */
D3DRS_PATCHEDGESTYLE = 163, /* 面片边缘样式(控制 N 面片细分时边缘的 tessellation 风格) */
D3DRS_DEBUGMONITORTOKEN = 165, /* 调试监控令牌(仅调试模式使用,用于调试监控工具标识) */
D3DRS_POINTSIZE_MAX = 166, /* 点精灵最大尺寸(float 类型,点缩放时的最大阈值) */
D3DRS_INDEXEDVERTEXBLENDENABLE = 167, /* 索引顶点混合启用状态(TRUE 表示启用索引式顶点混合,优化骨骼动画) */
D3DRS_COLORWRITEENABLE = 168, /* 颜色通道写入启用(控制 RGB 及 Alpha 通道是否允许写入渲染目标) */
D3DRS_TWEENFACTOR = 170, /* 过渡因子(float 类型,用于两帧顶点数据的线性过渡,如动画插值) */
D3DRS_BLENDOP = 171, /* 混合操作(取值为 D3DBLENDOP 枚举,定义源/目标混合因子的计算方式) */
D3DRS_POSITIONDEGREE = 172, /* N 面片位置插值阶数(D3DDEGREE_LINEAR 线性/ D3DDEGREE_CUBIC 三次,默认三次) */
D3DRS_NORMALDEGREE = 173, /* N 面片法向量插值阶数(D3DDEGREE_LINEAR 线性/ D3DDEGREE_QUADRATIC 二次,默认线性) */
D3DRS_SCISSORTESTENABLE = 174, /* 剪刀测试启用状态(TRUE 表示启用剪刀测试,只渲染指定矩形区域内的像素) */
D3DRS_SLOPESCALEDEPTHBIAS = 175, /* 斜率缩放深度偏移(用于避免共面物体的深度冲突,减少"Z 闪烁") */
D3DRS_ANTIALIASEDLINEENABLE = 176, /* 抗锯齿线段启用状态(TRUE 表示启用线段抗锯齿,使线段边缘更平滑) */
D3DRS_MINTESSELLATIONLEVEL = 178, /* 最小细分级别(控制 N 面片细分的最小次数) */
D3DRS_MAXTESSELLATIONLEVEL = 179, /* 最大细分级别(控制 N 面片细分的最大次数) */
D3DRS_ADAPTIVETESS_X = 180, /* X 轴自适应细分系数(控制自适应细分在 X 方向的灵敏度) */
D3DRS_ADAPTIVETESS_Y = 181, /* Y 轴自适应细分系数(控制自适应细分在 Y 方向的灵敏度) */
D3DRS_ADAPTIVETESS_Z = 182, /* Z 轴自适应细分系数(控制自适应细分在 Z 方向的灵敏度) */
D3DRS_ADAPTIVETESS_W = 183, /* W 轴自适应细分系数(控制自适应细分在 W 方向的灵敏度) */
D3DRS_ENABLEADAPTIVETESSELLATION = 184, /* 自适应细分启用状态(TRUE 表示启用 N 面片的自适应细分) */
D3DRS_TWOSIDEDSTENCILMODE = 185, /* 双面模板测试模式(BOOL 类型,TRUE 表示对多边形正反面使用不同模板规则) */
D3DRS_CCW_STENCILFAIL = 186, /* 逆时针面模板测试失败时的操作(取值为 D3DSTENCILOP 枚举,双面模板模式专用) */
D3DRS_CCW_STENCILZFAIL = 187, /* 逆时针面模板通过但深度失败时的操作(双面模板模式专用) */
D3DRS_CCW_STENCILPASS = 188, /* 逆时针面模板与深度均通过时的操作(双面模板模式专用) */
D3DRS_CCW_STENCILFUNC = 189, /* 逆时针面模板比较函数(双面模板模式专用) */
D3DRS_COLORWRITEENABLE1 = 190, /* 第 1 个渲染目标颜色通道写入启用(支持独立写入掩码的设备专用) */
D3DRS_COLORWRITEENABLE2 = 191, /* 第 2 个渲染目标颜色通道写入启用(支持独立写入掩码的设备专用) */
D3DRS_COLORWRITEENABLE3 = 192, /* 第 3 个渲染目标颜色通道写入启用(支持独立写入掩码的设备专用) */
D3DRS_BLENDFACTOR = 193, /* 混合因子(D3DCOLOR 类型,支持混合因子功能的设备专用,作为常量混合值) */
D3DRS_SRGBWRITEENABLE = 194, /* SRGB 写入启用状态(TRUE 表示将线性颜色转换为 SRGB 格式写入渲染目标) */
D3DRS_DEPTHBIAS = 195, /* 深度偏移(用于调整像素深度值,避免共面物体深度冲突) */
D3DRS_WRAP8 = 198, /* 第 8 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_WRAP9 = 199, /* 第 9 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_WRAP10 = 200, /* 第 10 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_WRAP11 = 201, /* 第 11 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_WRAP12 = 202, /* 第 12 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_WRAP13 = 203, /* 第 13 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_WRAP14 = 204, /* 第 14 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_WRAP15 = 205, /* 第 15 组纹理坐标的环绕模式(vs_3_0 及以上着色器专用) */
D3DRS_SEPARATEALPHABLENDENABLE = 206, /* 独立 Alpha 混合启用状态(TRUE 表示对 Alpha 通道使用单独的混合规则) */
D3DRS_SRCBLENDALPHA = 207, /* Alpha 通道源混合因子(独立 Alpha 混合模式专用,取值为 D3DBLEND 枚举) */
D3DRS_DESTBLENDALPHA = 208, /* Alpha 通道目标混合因子(独立 Alpha 混合模式专用,取值为 D3DBLEND 枚举) */
D3DRS_BLENDOPALPHA = 209, /* Alpha 通道混合操作(独立 Alpha 混合模式专用,取值为 D3DBLENDOP 枚举) */
D3DRS_FORCE_DWORD = 0x7fffffff, /* 强制枚举类型为 32 位大小 */
} D3DRENDERSTATETYPE;
示例
示例只展示了 着色模式(D3DRS_SHADEMODE)和填充模式(D3DRS_FILLMODE)
//设置着色模式
if (g_bFlat)
g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
else
g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
//设置填充模式
if (g_iFillmode == 1)
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT);
else if (g_iFillmode == 2)
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
else if (g_iFillmode == 3)
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
设置了渲染状态之后,实际绘制都会采用这个渲染状态,相当于是全局设置。
实际验证
运行后结果如下:

左键切换着色模式,D3DSHADE_FLAT(平面着色,颜色为顶点颜色平铺),D3DSHADE_GOURAUD(高洛德着色(平滑着色)),三个顶点混合颜色。
右键点击会选择填充模式 D3DFILL_POINT(仅渲染顶点),D3DFILL_WIREFRAME(线框模式,顶点通过线连接),D3DFILL_SOLID(实心填充默认,形成一个面)
以下就是实际的结果
平面着色(为第一个顶点的颜色全红)
高洛德着色(平滑混合颜色)
点填充模式(只显示三个顶点)

线框模式(显示三角形)

实心填充模式,显示三角形面
总结
渲染状态使用的细节很多,需要多多了解。
git仓库
https://github.com/kesshei/direct9Demo/tree/main/03_%E7%AC%AC%E4%B8%89%E7%AB%A0%20%E5%9D%90%E6%A0%87%E7%B3%BB%E4%B8%8E%E5%9F%BA%E6%9C%AC%E5%9B%BE%E5%85%83/04_RenderState
https://gitee.com/kesshei/direct9Demo/tree/main/03_%E7%AC%AC%E4%B8%89%E7%AB%A0%20%E5%9D%90%E6%A0%87%E7%B3%BB%E4%B8%8E%E5%9F%BA%E6%9C%AC%E5%9B%BE%E5%85%83/04_RenderState