【OSG学习笔记】Day 32: Texture1D(一维纹理)

Texture1D(一维纹理)
在 OpenSceneGraph(OSG)三维渲染开发中,纹理映射是提升模型视觉效果的核心手段。相较于常用的二维纹理(Texture2D),Texture1D(一维纹理) 凭借轻量化、高效计算的特性,成为高度渐变、颜色映射、体积渲染、流线可视化等场景的首选方案。
本文将深度解析 OSG 中 Texture1D 的核心原理、类继承关系,并提供可直接编译运行的完整实战代码,带你从零掌握一维纹理的开发与应用。
Texture1D 核心原理
1. 什么是一维纹理?
一维纹理(Texture1D)是仅沿单一坐标轴(S轴)采样的纹理,本质是一个高度为1、深度为1的二维图像,只有宽度维度有效。
它摒弃了二维纹理的平面采样逻辑,专注于单轴的颜色/数据映射,相比 2D 纹理更节省显存,计算效率更高,适合处理线性渐变、程序化颜色赋值等需求。
2. Texture1D 典型应用场景
- 模型沿坐标轴的高度/深度渐变染色(如地形海拔着色、机械零件分层渲染)
- 科学可视化中的温度、压力、速度等标量数据映射
- 轻量化程序化纹理生成、粒子系统颜色控制
- 体积渲染、流体仿真的核心纹理载体
3. OSG 中 Texture1D 工作流程
- 创建
Image对象,分配一维纹理内存(高度=1)并填充颜色数据 - 初始化
Texture1D对象,绑定纹理图像、设置环绕/过滤模式 - 配置
TexGen自动生成纹理坐标(指定纹理映射方向) - 通过
StateSet管理渲染状态,将一维纹理应用到 3D 模型
OSG Texture1D 核心类继承关系
OSG 采用面向对象的继承架构,Texture1D 及相关依赖类的层级关系清晰,理解继承关系是掌握纹理开发的关键(基于 OSG 3.6.5 稳定版本):
osg::Object (所有OSG对象的基类)
├── osg::StateAttribute (渲染状态属性基类)
│ ├── osg::Texture (纹理基类,封装通用纹理逻辑)
│ │ └── osg::Texture1D (一维纹理类,核心实现类)
│ └── osg::TexGen (纹理坐标生成器,自动生成S轴坐标)
├── osg::Image (纹理数据载体,存储一维像素数据)
├── osg::StateSet (渲染状态容器,管理纹理、材质等状态)
└── osg::Node (场景节点基类)
└── osg::Group (组节点,管理3D模型与场景)
核心类作用说明
- osg::Texture1D:一维纹理的核心实现类,继承自
osg::Texture,封装了 1D 纹理的创建、绑定、参数配置等所有底层逻辑。 - osg::Image:一维纹理的数据载体,必须分配为「宽度任意、高度=1、深度=1」的格式。
- osg::TexGen:自动纹理坐标生成器,无需手动为模型顶点赋值纹理坐标,直接按坐标轴生成映射关系。
- osg::StateSet:渲染状态管理器,所有纹理、材质、着色器都需要通过它绑定到模型上。
OSG Texture1D 完整实战代码
本代码实现为 3D 模型添加自定义一维纹理,包含纹理创建、坐标生成、状态绑定、场景渲染全流程,可直接编译运行。
完整代码(main.cpp)
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
#include <osg/Texture1D>
#include <osg/TexGen>
#include <osg/StateSet>
#include <osg/Image>
#include <osg/Group>
#include <osgViewer/Viewer>
#include <iostream>
// 核心函数:创建并配置一维纹理渲染状态
osg::ref_ptr<osg::StateSet> createTexture1DState()
{
// 1. 创建一维纹理图像载体(高度必须为1,符合1D纹理规范)
osg::ref_ptr<osg::Image> image = new osg::Image;
// 分配内存:宽度1024,高度1,深度1,RGBA四通道浮点型数据
image->allocateImage(1024, 1, 1, GL_RGBA, GL_FLOAT);
// 设置纹理内部格式,保证兼容性
image->setInternalTextureFormat(GL_RGBA);
// 2. 填充一维纹理颜色数据(可自定义渐变/固定颜色)
osg::Vec4* dataPtr = (osg::Vec4*)image->data();
for (int i = 0; i < 1024; ++i)
{
// 示例:红蓝渐变纹理(沿S轴从红色过渡到蓝色)
float t = i / 1024.0f;
*dataPtr++ = osg::Vec4(t, 0.0f, 1.0f - t, 1.0f);
}
// 3. 创建一维纹理对象
osg::ref_ptr<osg::Texture1D> texture = new osg::Texture1D;
// 纹理环绕模式:S轴镜像重复(解决纹理坐标越界)
texture->setWrap(osg::Texture1D::WRAP_S, osg::Texture1D::MIRROR);
// 纹理过滤模式:线性插值,保证渲染平滑无锯齿
texture->setFilter(osg::Texture1D::MIN_FILTER, osg::Texture1D::LINEAR);
texture->setFilter(osg::Texture1D::MAG_FILTER, osg::Texture1D::LINEAR);
// 将图像数据绑定到一维纹理
texture->setImage(image.get());
// 4. 配置自动纹理坐标生成器(沿Z轴生成纹理坐标)
osg::ref_ptr<osg::TexGen> texgen = new osg::TexGen;
// 生成模式:基于物体局部坐标生成(不受模型变换影响)
texgen->setMode(osg::TexGen::OBJECT_LINEAR);
// 设置S轴映射平面:沿Z轴生成纹理坐标
texgen->setPlane(osg::TexGen::S, osg::Plane(0.0f, 0.0f, 1.0f, 0.0f));
// 5. 创建状态集,管理所有渲染状态
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
// 绑定一维纹理到纹理单元0,强制覆盖子节点状态
stateset->setTextureAttribute(0, texture.get(), osg::StateAttribute::OVERRIDE);
stateset->setTextureMode(0, GL_TEXTURE_1D, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
// 启用自动纹理坐标生成
stateset->setTextureAttribute(0, texgen.get(), osg::StateAttribute::OVERRIDE);
stateset->setTextureMode(0, GL_TEXTURE_GEN_S, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
return stateset;
}
int main()
{
// 初始化OSG查看器
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
osg::ref_ptr<osg::Group> root = new osg::Group;
// 加载3D模型(替换为你的模型路径,支持osg/obj/fbx格式)
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cessna.osg");
if (!model)
{
std::cerr << "模型加载失败!请检查模型路径" << std::endl;
return -1;
}
// 为模型应用一维纹理
model->setStateSet(createTexture1DState());
root->addChild(model);
// 优化场景数据,提升渲染效率
osgUtil::Optimizer optimizer;
optimizer.optimize(root);
// 启动渲染
viewer->setSceneData(root);
viewer->realize();
return viewer->run();
}

代码核心模块解析
1. 一维纹理图像创建
image->allocateImage(1024, 1, 1, GL_RGBA, GL_FLOAT);
- 严格遵循 1D 纹理规范:高度=1,深度=1,仅宽度可自定义。
GL_RGBA表示红、绿、蓝、透明度四通道,GL_FLOAT支持高精度颜色渲染。
2. 纹理参数配置
- 环绕模式(Wrap):
MIRROR镜像重复,避免纹理坐标超出 [0,1] 时出现断裂。 - 过滤模式(Filter):
LINEAR线性插值,让纹理渲染更平滑,无锯齿/马赛克。
3. 自动纹理坐标生成
texgen->setPlane(osg::TexGen::S, osg::Plane(0.0f, 0.0f, 1.0f, 0.0f));
- 沿 Z轴 生成纹理坐标,修改参数可切换为 X/Y 轴:
- X轴:
osg::Plane(1.0f, 0.0f, 0.0f, 0.0f) - Y轴:
osg::Plane(0.0f, 1.0f, 0.0f, 0.0f)
- X轴:
总结
Texture1D 是 OSG 中轻量化、高效率的纹理方案,通过清晰的类继承架构和简洁的 API,可快速实现三维模型的线性渐变、数据映射等渲染效果。
本文提供的代码覆盖了 一维纹理创建、参数配置、坐标生成、场景渲染 全流程,结合类继承关系的解析,能帮助你彻底理解 Texture1D 的底层逻辑,可直接应用于车载仿真、科学可视化、三维建模等实际开发场景。

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)