【OSG学习笔记】Day 52: FadeText

张开发
2026/4/15 11:47:52 15 分钟阅读

分享文章

【OSG学习笔记】Day 52: FadeText
osgText::FadeText 用法详解与实战在 OpenSceneGraphOSG的文字渲染模块中osgText::FadeText是基于距离实现自动淡入淡出的核心类它解决了普通文字无论远近都保持固定显示的问题能根据相机与文字的距离自动调整透明度让三维场景中的文字渲染更自然、更轻量化。本文将全面解析FadeText的特性、继承关系、核心用法并提供可直接编译运行的完整实战代码。osgText::FadeText 核心特性osgText::FadeText是 OSG 专为距离关联的透明渐变文字设计的绘制类核心特性如下自动淡入淡出无需手动编写动画逻辑根据相机与文字的距离自动实现「远处透明、近处清晰」的效果继承普通文字能力完全保留文字设置、字体、颜色、大小、朝向等基础功能场景优化友好远距离文字自动透明/隐藏减少渲染压力提升场景性能兼容三维场景支持广告牌效果始终面向相机适配各类三维模型、地形场景。关键区别osgText::Text是静态文字永远不透明osgText::FadeText是动态渐变文字是 OSG 文字渲染的进阶方案。类继承关系osgText::FadeText并非独立类而是基于 OSG 底层绘制与文字基类的派生类完整继承关系osg::Object → osg::Drawable → osgText::TextBase → osgText::Text → osgText::FadeTextosg::DrawableOSG 所有可绘制对象的基类赋予渲染能力osgText::TextBase文字渲染抽象基类定义文字通用接口osgText::Text普通文字实现类基础文字渲染核心osgText::FadeText最终派生类新增淡入淡出逻辑扩展了距离透明功能。这意味着所有Text支持的用法FadeText都可以直接使用同时额外拥有渐变特性。核心 API 与使用要点基于实战代码我们梳理FadeText必用的关键方法对象创建osgText::FadeText* text new osgText::FadeText();文字内容text-setText(内容)支持字符串、数字转换字体设置text-setFont(字体路径)支持系统字体、自定义字体空间位置text-setPosition(osg::Vec3(x,y,z))设置三维坐标文字大小text-setCharacterSize(大小) 大小模式适配屏幕/三维坐标文字颜色text-setColor(osg::Vec4(r,g,b,a))RGBA 格式0~1面向屏幕text-setAutoRotateToScreen(true)广告牌效果文字始终正对相机渐变触发配合osg::ClusterCullingCallback实现距离渐变全版本通用。完整实战代码#includeosgViewer/Viewer#includeosg/Geode#includeosg/Group#includeosg/StateSet#includeosg/ClusterCullingCallback#includeosgText/FadeText// 使用OSG命名空间简化代码书写usingnamespaceosg;usingnamespaceosgText;/// 创建一排带淡入淡出效果的FadeText文字ref_ptrNodecreateFadeTextDemo(){// 根节点管理所有文字对象ref_ptrGrouprootNodenewGroup;ref_ptrGeodedrawableNodenewGeode;rootNode-addChild(drawableNode);// 渲染状态设置关闭深度测试关闭光照保证文字100%可见ref_ptrStateSetstateSetrootNode-getOrCreateStateSet();stateSet-setMode(GL_DEPTH_TEST,StateAttribute::OFF);// 关闭深度遮挡stateSet-setMode(GL_LIGHTING,StateAttribute::OFF);// 关闭光照文字不受光影影响// 循环创建20个文字排成一排for(inti0;i20;i){// 1. 创建FadeText对象FadeText*textnewFadeText;// 2. 设置文字内容text-setText(Hello);// 3. 设置字体路径相对路径可根据项目修改text-setFont(../../fonts/arial.ttf);// 4. 设置文字三维位置水平排成一排text-setPosition(Vec3(-50i*5,-50i*5,0));// 5. 设置文字大小与渲染模式text-setCharacterSize(30.0f);// 文字大小text-setCharacterSizeMode(Text::SCREEN_COORDS);// 屏幕坐标模式大小固定// 6. 设置文字颜色纯白色RGBA1,1,1,1text-setColor(Vec4(1.0f,1.0f,1.0f,1.0f));// 7. 关键文字始终面向屏幕广告牌效果text-setAutoRotateToScreen(true);// 8. FadeText核心设置距离渐变回调全OSG版本通用osg::Vec3 textPostext-getPosition();osg::Vec3normal(0.0f,0.0f,1.0f);floatfadeDistance200.0f;// 渐变触发距离text-setCullCallback(newosg::ClusterCullingCallback(textPos,normal,fadeDistance));// 将文字添加到可绘制节点drawableNode-addDrawable(text);}returnrootNode;}/// 主函数OSG窗口渲染intmain(){// 创建OSG查看器osgViewer::Viewer viewer;// 设置渲染场景淡入淡出文字viewer.setSceneData(createFadeTextDemo());// 设置窗口背景色灰色突出白色文字viewer.getCamera()-setClearColor(Vec4(0.2f,0.2f,0.2f,1.0f));// 启动渲染循环returnviewer.run();}使用场景适用场景三维场景中的距离提示文字如地标、标注需要优化渲染性能的大量文字场景仿真、可视化项目中的动态文字效果替代普通文字提升场景真实感与流畅度。总结osgText::FadeText是osgText::Text的派生类兼容所有普通文字用法核心能力是根据相机距离自动淡入淡出无需手动编写动画配合ClusterCullingCallback可实现全版本兼容的渐变效果关闭光照、深度测试后文字渲染更稳定无隐藏、黑屏问题。

更多文章