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

news2025/4/28 8:17:34

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

一、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.coloradmin.cn/o/2343808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Operating System 实验七 Linux文件系统实验

实验目标: 使用dd命令创建磁盘镜像文件ext2.img并格式化为ext2文件系统,然后通过mount命令挂载到Linux主机文件系统。查看ext2文件系统的超级块的信息,以及数据块的数量、数据块的大小、inode个数、空闲数据块的数量等信息 在文件系统中创建文件xxxxx.txt(其中xxxxx为你的学…

linux中shell脚本的编程使用

linux中shell脚本的编程使用 1.shell的初步理解1.1 怎么理解shell1.2 shell命令 2.shell编程2.1 什么是shell编程2.2 C语言编程 和 shell编程的区别 3.编写和运行第一个shell脚本程序3.1 编写时需要注意以下几点&#xff1a;3.1.1 shell脚本没有main函数&#xff0c;没有头文件…

图像畸变-径向切向畸变实时图像RTSP推流

实验环境 注意&#xff1a;ffmpeg进程stdin写入两张图片的时间间隔不能太长&#xff0c;否则mediamtx会出现对应的推流session超时退出。 实验效果 全部代码 my_util.py #进度条 import os import sys import time import shutil import logging import time from datetime i…

手搓雷达图(MATLAB)

看下别人做出来什么效果 话不多说&#xff0c;咱们直接开始 %% 可修改 labels {用户等级, 发帖数, 发帖频率, 点度中心度, 中介中心度, 帖子类型计分, 被列为提案数}; cluster_centers [0.8, 4.5, 3.2, 4.0, 3.8, 4.5, 4.2; % 核心用户0.2, 0.5, 0.3, 0.2, 0.1, 0.0, 0.0;…

汽车零配件供应商如何通过EDI与主机厂生产采购流程结合

当前&#xff0c;全球汽车产业正经历深刻的数字化转型&#xff0c;供应链协同模式迎来全新变革。作为产业链核心环节&#xff0c;汽车零部件供应商与主机厂的高效对接已成为企业发展的战略要务。然而&#xff0c;面对主机厂日益严格的数字化采购要求&#xff0c;许多供应商在ED…

闻性与空性:从耳根圆通到究竟解脱的禅修路径

一、闻性之不动&#xff1a;超越动静的觉性本质 在《楞严经》中&#xff0c;佛陀以钟声为喻揭示闻性的奥秘&#xff1a;钟声起时&#xff0c;闻性显现&#xff1b;钟声歇时&#xff0c;闻性不灭。此“不动”并非如磐石般凝固&#xff0c;而是指觉性本身超越生灭、来去的绝对性…

第34课 常用快捷操作——按“空格键”旋转图元

概述 旋转某个图元&#xff0c;是设计过程中常需要用到的操作&#xff0c;无论是在原理图中旋转某个图形&#xff0c;还是在PCB图中旋转某个元素。 旋转操作的快捷键是空格键。下面作详细介绍。 按空格键旋转图元 当我们选中一个图元时&#xff0c;按下空格键&#xff0c;即…

基于亚马逊云科技构建音频转文本无服务器应用程序

Amazon Transcribe是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能&#xff0c;例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务&#xff0c;也可以集成到应用程序中提供语音…

K8S Service 原理、案例

一、理论介绍 1.1、3W 法则 1、是什么&#xff1f; Service 是一种为一组功能相同的 pod 提供单一不变的接入点的资源。当 Service 存在时&#xff0c;它的IP地址和端口不会改变。客户端通过IP地址和端口号与 Service 建立连接&#xff0c;这些连接会被路由到提供该 Service 的…

实验四 进程调度实验

一、实验目的 1、了解操作系统CPU管理的主要内容。 2、加深理解操作系统管理控制进程的数据结构--PCB。 3、掌握几种常见的CPU调度算法&#xff08;FCFS、SJF、HRRF、RR&#xff09;的基本思想和实现过程。 4、用C语言模拟实现CPU调度算法。 5、掌握CPU调度算法性能评价指…

linux blueZ 第四篇:BLE GATT 编程与自动化——Python 与 C/C++ 实战

本篇聚焦 BLE(Bluetooth Low Energy)GATT 协议层的编程与自动化实践,涵盖 GATT 基础、DBus API 原理、Python(dbus-next/bleak)示例、C/C++ (BlueZ GATT API)示例,以及自动发现、读写特征、订阅通知、安全配对与脚本化测试。 目录 BLE GATT 基础概念 BlueZ DBus GATT 模…

Linux线程与进程:探秘共享地址空间的并发实现与内

Linux系列 文章目录 Linux系列前言一、线程的概念二、线程与地址空间2.1 线程资源的分配2.2 虚拟地址到物理地址的转换 三 、线程VS进程总结 前言 在Linux操作系统中&#xff0c;线程作为CPU调度的基本单位&#xff0c;起着至关重要的作用。深入理解线程控制机制&#xff0c;是…

科学养生,开启健康生活新方式

在快节奏的现代生活中&#xff0c;健康养生已成为人们关注的焦点。科学的养生方式不仅能增强体质&#xff0c;还能有效预防疾病&#xff0c;提升生活质量。​ 合理饮食是健康养生的基础。日常饮食应遵循均衡原则&#xff0c;保证蛋白质、碳水化合物、脂肪、维生素和矿物质的合…

外贸图片翻译软件推荐用哪些?不损原图画质的跨境图片翻译器,收藏!

在跨境电商的 “江湖” 里&#xff0c;卖家们怀揣着全球 “捞金” 的梦想扬帆起航&#xff0c;可谁能想到&#xff0c;一个看似不起眼的 “小怪兽”—— 图片翻译难题&#xff0c;却常常让大家在 “出海” 途中 “栽跟头”。 电商跨境图片翻译全能王——风车AI翻译 [fengchef…

3.1/Q1,Charls最新文章解读

文章题目&#xff1a;The impact of chronic diseases and lifestyle on sarcopenia risk in older adults: a population-based longitudinal study DOI&#xff1a;10.3389/fmed.2025.1500915 中文标题&#xff1a;慢性病和生活方式对老年人肌肉减少症风险的影响&#xff1a;…

简单几步,开启 Intel VT-x 让电脑“解开CPU封印”

#vmware #虚拟机 #cpu虚拟化 # Intel VT-x 前言 你是不是也遇到过这种情况&#xff1a;在尝试运行虚拟机&#xff08;VM&#xff09;、安卓模拟器&#xff0c;或者使用 Windows 沙盒、WSL2 等功能时&#xff0c;遇到了类似“此主机支持 Intel VT-x&#xff0c;但 Intel VT-x …

flutter 插件收集

2025年 1月10号Flutter插件手机 声音转文字 speech_to_text | Flutter package 文字转声音 flutter_tts | Flutter package 堆栈信息 stack_trace | Dart package 跳转到app设置里面 app_settings | Flutter package 轻松的动画 animations | Flutter package 日志打印 t…

pyenv-virtualenv(python 版本管理工具)

推荐参考&#xff08;本人实测有用&#xff09; 参考文章pyenv 和 pyenv-virtualenv 的安装、配置和使用&#xff08;仅供参考&#xff09; 参考文章 pyenvpyenv-virtualenv&#xff08;仅供参考&#xff09; pyenv (windows)安装 手动安装 git clone https://github.com/pye…