C++DirectX9坐标系与基本图元之渲染状态(RenderState)_0304

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
相关推荐
一天睡25小时4 小时前
想偷卷?但微信不支持md文档?这个软件助你!
前端·javascript
艾小码4 小时前
3个技巧让你彻底搞懂JavaScript异步编程
前端·javascript
筏.k5 小时前
C++ 设计模式系列:生产者-消费者模式完全指南
开发语言·c++·设计模式
LabVIEW开发7 小时前
LabVIEW中VI间数据传递方式
性能优化·labview·labview知识·labview功能·labview程序
Y42588 小时前
本地多语言切换具体操作代码
前端·javascript·vue.js
wb043072019 小时前
性能优化实战:基于方法执行监控与AI调用链分析
java·人工智能·spring boot·语言模型·性能优化
LXS_3579 小时前
Day 05 C++ 入门 之 指针
开发语言·c++·笔记·学习方法·改行学it
fruge9 小时前
React 2025 完全指南:核心原理、实战技巧与性能优化
javascript·react.js·性能优化
速易达网络11 小时前
Bootstrap 5 响应式网站首页模板
前端·bootstrap·html