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

【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 
http://www.xdnf.cn/news/2129.html

相关文章:

  • LibAI Lab闪耀AI出海峰会:技术深耕与全球化增长的双重奏
  • Q2桥门式起重机司机考试复习重点
  • 告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct
  • 前馈神经网络层
  • 罗德FSP13 FSP40频谱分析仪频率13.6GHz
  • ViTMAE:掩码自编码器是可扩展的视觉学习者
  • P4017 最大食物链计数-拓扑排序
  • 国标44496详细分析
  • org.apache.ibatis.plugin.Invocation 类详解
  • 树莓派4B+Ubuntu24.04 电应普超声波传感器串口输出 保姆级教程
  • 基于AI技术的高速公路交通引流系统设计与应用研究
  • kubernets集群的安装-node节点安装-(简单可用)-超详细
  • 智能电网第8期 | 视频监控与数据同传解决方案
  • wsl联通外网
  • SQL注入高级绕过手法汇总 重点
  • 神经发育过程中大脑临界状态的图神经网络分析方法
  • 市场上常见的工作流工具
  • 浅谈OpenAIClaude LLM Tools的额外配置
  • 计算机组成原理实验(1) 算术逻辑运算单元实验
  • Java 设计模式心法之第21篇 - 命令 (Command) - 将请求封装成对象,实现操作解耦与扩展
  • verilog中实现单周期cpu的RVM指令(乘除取模)
  • 登高架设作业证考试的实操项目有哪些?
  • 前端八股 2
  • 支持私有化部署的电子合同平台——一合通
  • 01.oracle SQL基础
  • 使用Go语言实现轻量级消息队列
  • Ubuntu系统卡机日志笔记
  • OpenHarmony 5.0设置锁屏密码失败
  • QuecPython+USBNET:实现USB网卡功能
  • 真.从“零”搞 VSCode+STM32CubeMx+C <2>调试+烧录