当前位置: 首页 > news >正文

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);
elseg_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
http://www.dtcms.com/a/511992.html

相关文章:

  • 网站建设app长春seo技术
  • 【C++】力扣hot100错误总结
  • C++中的vector讲解
  • 笔记【字符串,转义字符,注释】
  • visual studio安装本地帮助手册
  • 北京市基础建设质量监督局网站wordpress 插件怎么看
  • 大模型技术分析与演进逻辑
  • 苏州模板网站建站长沙网站建设推广
  • 从零起步学习MySQL || 第六章:MySQL数据库中的一条数据是如何存储的?(结合源码深度解析)
  • 微信小程序页面配置,基本语法,页面切换,tabbar全局配置
  • 数据结构 07
  • 18.基本的ACL
  • 网站后台编程语言创业中文网站模板
  • 从“刘易斯拐点”到“骑手拐点”,即时零售3.0时代还有多远?
  • 有没有一种app类似网站建设开发定制软件开发
  • 沈阳网站建设建设公司普洱网站建设
  • 蓝桥杯题库——部分简单题题解(Java)
  • 新民电商网站建设程序wordpress淘宝发货插件
  • 多服务隔离部署jenkins自动化脚本:从构建到上线的全流程保障
  • React JSX完全指南
  • CSS进阶 | 不用一行JS!用纯CSS打造会动的现代化单页应用(3D翻转卡片)
  • 云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
  • LeetCode 410.分割数组的最大值
  • python批量读取word表格写入excel固定位置
  • 区块链知识总结
  • 开关电源三种拓扑资料整理
  • xss-labs pass-07
  • ES安装和简单讲解
  • Microtest的整套承包系统(turnkey system)目标电源设备特性
  • 程序员学习大模型必备:2025年“人工智能+“行业标杆案例荟萃(附下载)