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

【OSG学习笔记】Day 9: 状态集(StateSet)与渲染优化 —— 管理混合、深度测试、雾效等渲染状态

在这里插入图片描述
干货开始。_

一、StateSet核心概念与作用

StateSet 是OSG(OpenSceneGraph)中管理渲染状态的核心类,用于封装 OpenGL 渲染状态(如混合、深度测试、雾效、材质、纹理、着色器等),并将这些状态应用于节点或几何体。

通过合理组织 StateSet,可实现:

  • 渲染状态的高效复用:避免重复设置相同状态,提升渲染性能。
  • 分层级的状态管理:通过节点树的继承关系,实现状态的层级覆盖与合并。
  • 精细化控制渲染效果:针对不同场景元素(如透明物体、不透明物体、粒子系统等)设置独立状态。

二、核心渲染状态管理实践

(一)混合(Blending)

作用

实现半透明物体渲染(如玻璃、烟雾、粒子),通过混合公式计算像素颜色与已渲染像素的融合效果。

关键接口与代码示例
#include <osg/StateSet>
#include <osg/BlendFunc>// 创建StateSet
osg::ref_ptr<osg::StateSet> stateSet = new osg::StateSet();// 启用混合
stateSet->setMode(GL_BLEND, osg::StateAttribute::ON);// 设置混合公式(源因子=GL_SRC_ALPHA,目标因子=GL_ONE_MINUS_SRC_ALPHA)
stateSet->setAttributeAndModes(new osg::BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), osg::StateAttribute::ON);// 应用到节点
osg::ref_ptr<osg::Node> node = new osg::Geode();
node->setStateSet(stateSet);
常见混合模式
模式名称混合公式(源因子, 目标因子)典型应用场景
正常混合(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)玻璃、烟雾、半透明材质物体
加法混合(GL_ONE, GL_ONE)灯光效果、粒子特效、发光物体
减法混合(GL_ONE_MINUS_DST_COLOR, GL_ONE)阴影模拟、暗化特效
乘法混合(GL_DST_COLOR, GL_ZERO)颜色融合、纹理叠加效果
屏幕混合(GL_ONE_MINUS_DST_COLOR, GL_ONE)光照增强、HDR 效果模拟
覆盖混合(GL_SRC_ALPHA_SATURATE, GL_ONE)半透明物体覆盖效果、UI 元素叠加
反向混合(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA)特殊效果、反向半透明效果

(二)深度测试(Depth Test)

作用

控制像素的可见性,避免透明物体遮挡不透明物体时出现“Z冲突”,确保渲染顺序正确。

关键接口与代码示例
// 启用深度测试
stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);// 设置深度测试函数(默认GL_LESS,即仅当新像素深度值更小时绘制)
stateSet->setDepthFunction(GL_LEQUAL); // 允许等于时绘制(适用于半透明物体排序)
透明物体渲染注意事项
  1. 关闭深度写入:对纯透明物体,可关闭深度缓冲写入以提升性能:
    stateSet->setMode(GL_DEPTH_WRITE, osg::StateAttribute::OFF);
    
  2. 排序渲染顺序:通过 osg::StateSet::setRenderingHint(osg::StateSet::TRANSPARENT_BIN) 将透明物体归入透明渲染桶,确保从后往前绘制。

(三)雾效(Fog)

作用

模拟大气散射效果,使远处物体颜色逐渐淡化,增强场景纵深感。

关键接口与代码示例
#include <osg/Fog>// 创建雾效属性
osg::ref_ptr<osg::Fog> fog 

相关文章:

  • 【python】如何将python程序封装为cpython的库
  • 支付场景下,乐观锁的实现(简洁版)
  • 利用车联网中的 V2V 通信技术传播公平的紧急信息
  • 液体神经网络LNN-Attention创新结合——基于液体神经网络的时间序列预测(PyTorch框架)
  • GAEA情感坐标背后的技术原理
  • 皖维 大病救助办理手续说明
  • Linux多线程技术
  • 【Echarts】使用echarts绘制多个不同类型的中国地图
  • Java 安全:如何实现用户认证与授权?
  • 微信小程序文章管理系统开发实现
  • C++智能指针概念理解的面试题
  • 4/25 研0学习日志
  • 【产品经理】常见的交互说明撰写方法
  • 工业电子测量中的安全隐患与解决方案——差分探头的技术优势解析
  • 小白电路设计-设计11-恒功率充电电路设计
  • 人工智能与机器学习:Python从零实现逻辑回归模型
  • 遥测终端机,推动灌区流量监测向数据驱动跃迁
  • P19:Inception v1算法实战与解析
  • 第1讲|R语言绘图体系总览(Base、ggplot2、ComplexHeatmap等)
  • 2025年GPLT团体程序设计天梯赛L1-L2
  • 来论|这无非就是一只“纸老虎”:评特朗普政府“关税战”
  • 临沂文旅集团被诉侵权,原告每年三百余起类案
  • 2025年全国贸易摩擦应对工作会议在京召开
  • 证券时报:落实“非禁即入” ,让创新活力充分涌流
  • 岭南非遗大IP来上海了,舞剧《英歌》在文化广场连演两场
  • 著名茶叶专家谢丰镐逝世,享年95岁