【OSG学习笔记】Day 44: Scissor( 屏幕裁剪)

张开发
2026/4/12 10:05:57 15 分钟阅读

分享文章

【OSG学习笔记】Day 44: Scissor( 屏幕裁剪)
OSG 屏幕裁剪利器 osg::Scissor在 OpenSceneGraph 三维渲染开发中除了基于三维空间的裁剪平面ClipPlane还有一个专门用于屏幕二维区域裁剪的高效工具——osg::Scissor裁剪测试。它基于 OpenGL 原生的 Scissor Test 机制能够精准限定屏幕上的渲染区域是实现分屏、UI 裁剪、局部渲染优化的核心手段。本文结合完整可运行代码系统讲解osg::Scissor的继承关系、核心原理、使用方法并与osg::ClipPlane做全方位对比帮你快速区分两者的使用场景在开发中精准选型。osg::Scissor 类继承关系osg::Scissor是 OSG 渲染状态体系的标准组件严格遵循 OSG 面向对象设计其完整继承链如下osg::Object └── osg::StateAttribute └── osg::Scissor层级类作用解析osg::ObjectOSG 所有对象的基类提供智能指针ref_ptr、引用计数、对象销毁等基础能力保证内存安全。osg::StateAttribute渲染状态属性基类光照、纹理、材质、裁剪平面/屏幕裁剪都继承于此统一通过节点的StateSet管理。osg::Scissor屏幕裁剪测试的具体实现类封装了 OpenGL 裁剪测试的全部功能提供矩形区域设置、参数修改接口。✅核心特性Scissor属于渲染状态必须绑定到节点的StateSet并启用才能生效这是 OSG 所有渲染属性的标准使用方式。osg::Scissor 核心原理osg::Scissor实现的是OpenGL 裁剪测试Scissor Test核心作用在屏幕上定义一个矩形区域仅该区域内的像素会被渲染区域外的像素直接被丢弃。1. 坐标系规则OSG/OpenGL 屏幕坐标系原点 (0,0)窗口左下角X 轴向右递增Y 轴向上递增2. 核心接口// 设置裁剪矩形x(左下x), y(左下y), width(宽), height(高)voidsetScissor(intx,inty,intwidth,intheight);所有参数单位均为屏幕像素简单直观。3. 启用方式// 将裁剪状态绑定到节点开启裁剪node-getOrCreateStateSet()-setAttributeAndModes(scissor,osg::StateAttribute::ON);完整实战代码解析以下代码实现屏幕固定区域裁剪模型仅在指定矩形内显示可直接编译运行#includeosgViewer/Viewer#includeosg/Node#includeosg/Geode#includeosg/Group#includeosg/Scissor// 核心屏幕裁剪头文件#includeosgDB/ReadFile#includeosgUtil/Optimizerintmain(){// 1. 创建渲染窗口osg::ref_ptrosgViewer::ViewerviewernewosgViewer::Viewer();// 2. 创建屏幕裁剪对象osg::ref_ptrosg::Scissorscissornewosg::Scissor();// 定义裁剪区域左下角(150,150)宽800高600scissor-setScissor(150,150,800,600);// 3. 创建场景根节点osg::ref_ptrosg::Grouprootnewosg::Group();// 4. 加载模型osg::ref_ptrosg::NodenodeosgDB::readNodeFile(cow.osg);if(!node){OSG_WARN模型加载失败std::endl;return1;}root-addChild(node.get());// 5. 启用屏幕裁剪核心步骤root-getOrCreateStateSet()-setAttributeAndModes(scissor.get(),osg::StateAttribute::ON);// 6. 优化场景osgUtil::Optimizer optimizer;optimizer.optimize(root.get());// 7. 启动渲染viewer-setSceneData(root.get());viewer-realize();viewer-run();return0;}运行效果osg::Scissor 使用场景Scissor专注屏幕二维裁剪适用场景明确且高效多视口/分屏渲染把窗口划分为多个区域分别渲染不同场景如三维软件的四视图。UI 界面裁剪限制 2D 界面、文本、图标在指定面板内显示防止内容溢出。局部渲染优化仅渲染窗口部分区域减少 GPU 绘制像素量提升性能。截图/局部预览只渲染指定区域用于生成局部预览图、小窗口监控画面。特效遮罩实现屏幕圆形、矩形视野框用于游戏、仿真的视觉特效。osg::Scissor 与 osg::ClipPlane 全方位对比这是 OSG 开发中最容易混淆的两个概念下表清晰区分两者核心差异对比维度osg::Scissor屏幕裁剪osg::ClipPlane空间裁剪裁剪维度二维屏幕像素空间三维模型/世界空间裁剪对象最终渲染的屏幕像素三维模型的几何体本身坐标系屏幕像素坐标原点左下三维空间坐标裁剪形状只能是矩形无限大平面可组合任意形状核心用途分屏、UI 裁剪、区域渲染模型剖切、截面显示、内部查看硬件限制无数量限制全局一个生效OpenGL 最多支持 6 个性能极低开销GPU 原生支持极低开销硬件加速典型效果屏幕局部显示模型模型被“切开”显示内部结构一句话区分想切屏幕→ 用Scissor想切模型→ 用ClipPlane总结osg::Scissor是 OSG 中极简、高效、专用的屏幕裁剪工具继承自标准渲染状态StateAttribute使用方式简单、性能优异。它与osg::ClipPlane互为补充Scissor管屏幕做分屏、UI、区域渲染ClipPlane管空间做剖切、截面、模型裁剪。掌握两者的原理与区别就能在三维开发中灵活实现各类裁剪需求无论是工业仿真、UI 界面还是多视口渲染都能轻松应对。

更多文章