实用指南:OSG多视口与多通道渲染核心技术解析

news/2025/12/7 12:23:43/文章来源:https://www.cnblogs.com/tlnshuju/p/19317927

实用指南:OSG多视口与多通道渲染核心技术解析

2025-12-07 12:19  tlnshuju  阅读(0)  评论(0)    收藏  举报

OSG 的 多视口 (Multi-Viewport)多通道/多遍渲染 (Multi-Pass / Multi-Channel) 知识框架。这是实现复杂渲染技术(如 RTT、阴影贴图、后期处理、立体渲染等)的基础。


OSG 多视口与多通道知识框架详解

I. 核心原理与概念

在 OSG 中,多视口和多通道渲染都是基于 OpenGL 的 帧缓冲区对象 (FBO)渲染上下文 (GraphicsContext) 进行组织的。

1. 视口 (Viewport)

视口是渲染结果最终显示的矩形区域,定义了屏幕或 FBO 附件上的像素坐标。

  • OpenGL 原理: 通过 glViewport(x, y, width, height) 函数设置。它将 NDC (Normalized Device Coordinates, 规范化设备坐标,∈[−1,1]\in [-1, 1][1,1]) 映射到屏幕或 FBO 的像素坐标。
  • OSG 实践:osg::Camera 对象的 setViewport(osg::Viewport*)setViewport(x, y, w, h) 方法设置。
2. 相机 (osg::Camera)

osg::Camera 是 OSG 中实现多视口和多通道渲染的核心。它封装了 OpenGL 的渲染状态(如视口、清除颜色、深度测试、FBO 绑定等)。

属性作用
ViewMatrix定义视点位置和方向 (OpenGL ModelView Matrix)
ProjectionMatrix定义投影类型 (透视/正交) 和裁剪范围
Viewport定义输出的屏幕/FBO 区域
RenderOrder决定相机绘制的顺序(如 PRE_RENDER, POST_RENDER
RenderTargetImplementation决定输出目标 (FRAME_BUFFER_OBJECTPIXEL_BUFFER)
Attach绑定 FBO 附件 (Texture2D, Image, RenderBuffer)
3. 多视口 (Multi-Viewport)

多视口是指在 同一个渲染窗口 (GraphicsContext) 中,使用 多个独立的 osg::Camera 在不同的屏幕区域进行渲染。

  • 原理: 每个 osg::Camera 都设置一个不同的 osg::Viewport。当 OSG 遍历场景图时,它会依次激活每个相机,调用其设置的 glViewport,然后使用该相机的状态渲染其子图。
  • 应用: 分屏显示、HUD (平视显示器)、小地图、显示不同视角的预览等。
4. 多通道/多遍渲染 (Multi-Pass / Multi-Channel Rendering)

多通道通常指两个概念:


II. 实践应用与代码实现

1. 多视口实现:分屏显示

实现方法是在主场景图的根节点下添加多个设置了不同视口的 osg::Camera

C++ 核心代码:

// 主视口/Viewer Camera(通常全屏)
osg::ref_ptr<osg::Camera> mainCamera = viewer->getCamera();mainCamera->setViewport(0, 0, 800, 600);mainCamera->addChild(mainScene.get());// 第二视口 (小地图/预览)osg::ref_ptr<osg::Camera> subCamera = new osg::Camera;subCamera->setViewport(600, 400, 200, 200); // 放在右上角 (x=600, y=400, w=200, h=200)subCamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);subCamera->setClearColor(osg::Vec4(0.1f, 0.1f, 0.2f, 1.0f));subCamera->setProjectionMatrixAsPerspective(30.0, 1.0, 1.0, 1000.0);subCamera->setViewMatrixAsLookAt(osg::Vec3(0, 0, 50), osg::Vec3(0, 0, 0), osg::Vec3(0, 1, 0));subCamera->setRenderOrder(osg::Camera::POST_RENDER); // 确保在主场景之后绘制// 将子相机添加到场景图,由主 Viewer 驱动渲染osg::ref_ptr<osg::Group> root = new osg::Group;root->addChild(mainScene.get());root->addChild(subCamera.get());
2. 多通道/多遍渲染实现:RTT 链

这是最常见的复杂渲染结构,如您之前的高程计算需求。

通道/阶段目标相机类型RenderTargetImplementation
Pass 1 (Depth/Data)渲染 3D 模型,输出数据到 Texture Aosg::CameraFRAME_BUFFER_OBJECT
Pass 2 (Compute/Final)渲染 2D Quad,采样 Texture A,计算结果输出到 Texture Bosg::CameraFRAME_BUFFER_OBJECT 或 屏幕

C++ 核心代码 (Pass 1 RTT):

// Pass 1: depthCamera (RTT 到 Texture)
osg::ref_ptr<osg::Texture2D> depthTexture = new osg::Texture2D;depthTexture->setInternalFormat(GL_R32F);// ... (设置 textureSize, filter) ...osg::ref_ptr<osg::Camera> depthCamera = new osg::Camera;depthCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);depthCamera->setRenderOrder(osg::Camera::PRE_RENDER);depthCamera->setViewport(0, 0, W, H);depthCamera->attach(osg::Camera::COLOR_BUFFER0, depthTexture.get()); // 绑定 FBO 附件depthCamera->addChild(scene_root.get()); // 渲染 3D 场景// Pass 2: computeCamera (读取 depthTexture 进行计算)// ... (略) ...
3. 多通道输出实现:MRT (Multi-Render Target)

单次渲染 中同时输出多个数据。

C++ 核心代码 (MRT Setup):

// Texture 1: 颜色/高程 (附件 0)
osg::ref_ptr<osg::Texture2D> tex0 = new osg::Texture2D;tex0->setInternalFormat(GL_R32F); // 高精度高程// Texture 2: 法线/NDC 深度 (附件 1)osg::ref_ptr<osg::Texture2D> tex1 = new osg::Texture2D;tex1->setInternalFormat(GL_RGBA8); // 法线或其他数据osg::ref_ptr<osg::Camera> mrtCamera = new osg::Camera;// ... (设置 Viewport, RenderOrder, FBO) ...// 【核心 MRT 绑定】mrtCamera->attach(osg::Camera::COLOR_BUFFER0, tex0.get()); // 附件 0mrtCamera->attach(osg::Camera::COLOR_BUFFER1, tex1.get()); // 附件 1// 【着色器 Program 绑定】osg::ref_ptr<osg::Program> program = new osg::Program;// ... (添加 Shader) ...osg::StateSet* ss = mrtCamera->getOrCreateStateSet();ss->setAttributeAndModes(program.get(), osg::StateAttribute::ON);

GLSL 核心代码 (MRT Fragment Shader):

#version 330 core
// 声明两个输出变量,分别对应 COLOR_BUFFER0 和 COLOR_BUFFER1
layout(location = 0) out float out_Elevation; // 附件 0 (R32F)
layout(location = 1) out vec4 out_Normal;     // 附件 1 (RGBA8)
void main()
{// ... (计算逻辑) ...out_Elevation = calculated_height;out_Normal = vec4(normalize(world_normal), 1.0);
}

III. 知识结构总结 (Mermaid 图)

在这里插入图片描述


IV. 关键属性对比表格

特性osg::Cameraosg::Viewportosg::Texture2Dosg::Image
GL 对应渲染状态、FBOglViewportglTexImage2D, glBindTextureCPU 内存缓冲区
主要作用定义渲染流程、矩阵、输出目标定义屏幕/FBO 上的像素区域GPU 内存存储,作为 FBO 附件或采样输入CPU 内存存储,作为 readPixels 目标或纹理数据源
多通道/MRT通过 attach(COLOR_BUFFERN, ...) 实现定义 MRT 的尺寸作为 FBO 的颜色附件 (输出)CPU 回读目标 (输出)
多遍渲染用于定义每个渲染通道 (Pass) 的状态Pass 1 输出,Pass 2 输入 (采样)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991370.shtml

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

相关文章

P8313 [COCI 2021/2022 #4] Izbori

洛谷 首先观察部分分,对于前两组部分分,可以直接暴力枚举左右端点。 对于第三组部分分,从前缀和的角度去思考,然后可以发现假设一个数字为正数,一个数字为负数,开桶进行统计,只要两种人数不打平即可。 代码: #…

汽车智能座舱软件、技术、分类介绍

汽车智能座舱软件介绍 一、OSI模型1、(CANH = 3.5V)- (CANL = 1.5V)= 2V 低电压,逻辑零,显性信号 2、(CANH = 2.5V)- (CANL = 2.5V)= 0V 高电压,逻辑一,隐形信号二、技术架构三、关键技术汽车智能座舱软…

2025 最新智能制造服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威推荐榜单发布,引领智慧工厂建设新生态

随着工业4.0进程的加速,智能制造已成为推动制造业转型升级的核心引擎。市场对专业智能制造解决方案的需求日益增长,对服务商的技术实力、行业经验与全周期服务能力提出了更高要求。本榜单基于技术创新力、行业适配性…

『NAS』在群晖部署图表绘制工具-Draw.io

点赞 + 关注 + 收藏 = 学会了整理了一个NAS小专栏,有兴趣的工友可以关注一下 👉 《NAS邪修》Draw.io 是一款免费开源的在线图表绘制工具,支持创建流程图、思维导图、UML 图等多种图表,提供跨平台使用和多格式导出…

CF762E Radio stations

Codeforces 很明显是一道偏序问题,我们先列出满足条件的台之间的关系。 \[\min(r_i,r_j)\ge|x_i-x_j| \]\[|f_i-f_j|\le k \]这看起来好像是两条式子,但是不能直接使用二维偏序解决,因为其中含有取最小值操作,所以…

grep 常用功能

grep 常用功能 检索服务器文件的 panic // 查找文件中包含 panic 的行,并要同时显示上下各 20 行,-A 代表显示匹配行之后的指定行数,-B 代表显示匹配行之前的指定行数。 grep -A 20 -B 20 "panic" daemon…

2025 最新工业自动化服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威榜单发布,引领智慧工厂建设新生态

随着工业4.0时代的深入推进,工业自动化已成为制造企业实现高效、智能、绿色生产的核心驱动力。本榜单基于技术创新能力、行业服务深度、全周期解决方案能力三大维度(德尔智慧新增“资产健康管理”维度),结合行业实…

2025 最新智慧工厂建设服务商/厂家 TOP5 评测!科技赋能+全周期服务权威推荐榜单发布,引领智能制造新生态

随着工业4.0浪潮的深入推进,智慧工厂建设已成为制造企业实现转型升级、提升核心竞争力的关键路径。本榜单基于技术创新力、行业适配性、服务覆盖度及全生命周期管理能力四大维度,结合行业发展趋势与客户实际应用反馈…

why windows is worst

because apple is better. picograph can not see this graph, but poems are similar.

4pcs Launch LTR-05 TPMS Sensor Tool 315MHz 433MHz - Metal/Rubber for European/American Cars

Why TPMS Sensors Matter (and Why Your Current Solution Might Fall Short) Tire Pressure Monitoring Systems (TPMS) are critical for road safety, fuel efficiency, and tire longevity. Accurate, reliable TP…

Get Lifetime Free Launch X431 ADAS Calibration for PAD VII/Pro5/Pro3S+/Pro3/APEX

The ADAS Calibration Challenge: Why Mechanics and Car Owners Need a Reliable Solution ADAS (Advanced Driver Assistance Systems) has become a staple in modern vehicles, enhancing safety with features li…

儿童补钙不盲选!从钙源到配方,儿童钙剂选购全指南

钙是儿童骨骼与牙齿发育的核心营养素,对神经传导、肌肉收缩等生理功能也至关重要。但面对市面上琳琅满目的补钙产品,很多家长难免陷入选择困境。既要考虑钙源的安全性与吸收率,又要兼顾孩子的接受度,选对品牌才能让…

2025年ChatGPT优化排名公司推荐:AI驱动下的SEO新选择

随着ChatGPT等生成式AI技术的爆发,搜索引擎优化领域正经历前所未有的变革,AI语料优化、生成式引擎优化已成为提升排名的核心抓手。在这一趋势下,能够整合GEO生成引擎优化、AI关键词排名优化等技术的服务公司,逐渐成…

【拓补排序 TB_sort】P4017 最大食物链计数

P4017 最大食物链计数 链接此处 题目背景 你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。 题…

2025年深圳GEO优化公司推荐:AI驱动时代的流量突围伙伴

2025年的深圳,生成式AI技术的爆发式增长正重塑企业流量获取逻辑,当用户在豆包、文心一言等主流AI引擎中检索需求时,品牌能否成为优先推荐的信源,直接决定了市场竞争力。在此背景下,GEO生成式引擎优化(生成式引擎…

2025年11月儿童营养品牌测评指南——选对不踩坑

孩子挑食偏食、身高体重不达标、换季容易生病,这些问题总能牵动家长的心弦。据《中国居民膳食指南》数据显示,我国3-12岁儿童钙缺乏率达58.3%,锌缺乏率34.2%,科学补充营养成为家庭育儿的重要课题。但面对琳琅满目的…

2025年深圳AI搜索排名优化公司推荐

2025年的深圳,AI搜索浪潮已从技术探索迈向商业落地的深水区,GEO优化(生成式引擎优化)与AI搜索排名优化共同构建起品牌流量竞争的新赛道。中国信通院数据显示,今年国内GEO市场规模已突破148亿元,年复合增速达53%,…

【AI大模型技术】2.神经网络 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P3120 [USACO15FEB] Cow Hopscotch G

洛谷 由于需要考虑颜色的问题,所以可以考虑将总方法减去相同颜色的方案数,以此得到本次的结果。 使用前缀和,得到此处的方案总数。 然后就需要考虑如何处理颜色的问题了,由于需要进行区间修改与查询,很容易想到使…

Easysearch 2.0.0 性能测试

Easysearch 2.0.0 正式版性能全面提升:索引、查询及内存管理(GC)等核心性能均获显著优化。概述 Easysearch 2.0.0 正式版带来了显著的性能提升和优化改进。通过与上一个稳定版本 1.15.6 的全面对比测试,我们使用 e…