在这里插入图片描述

Texture1D(一维纹理)

在 OpenSceneGraph(OSG)三维渲染开发中,纹理映射是提升模型视觉效果的核心手段。相较于常用的二维纹理(Texture2D),Texture1D(一维纹理) 凭借轻量化、高效计算的特性,成为高度渐变、颜色映射、体积渲染、流线可视化等场景的首选方案。

本文将深度解析 OSG 中 Texture1D 的核心原理、类继承关系,并提供可直接编译运行的完整实战代码,带你从零掌握一维纹理的开发与应用。

Texture1D 核心原理

1. 什么是一维纹理?

一维纹理(Texture1D)是仅沿单一坐标轴(S轴)采样的纹理,本质是一个高度为1、深度为1的二维图像,只有宽度维度有效。

它摒弃了二维纹理的平面采样逻辑,专注于单轴的颜色/数据映射,相比 2D 纹理更节省显存,计算效率更高,适合处理线性渐变、程序化颜色赋值等需求。

2. Texture1D 典型应用场景

  • 模型沿坐标轴的高度/深度渐变染色(如地形海拔着色、机械零件分层渲染)
  • 科学可视化中的温度、压力、速度等标量数据映射
  • 轻量化程序化纹理生成、粒子系统颜色控制
  • 体积渲染、流体仿真的核心纹理载体

3. OSG 中 Texture1D 工作流程

  1. 创建 Image 对象,分配一维纹理内存(高度=1)并填充颜色数据
  2. 初始化 Texture1D 对象,绑定纹理图像、设置环绕/过滤模式
  3. 配置 TexGen 自动生成纹理坐标(指定纹理映射方向)
  4. 通过 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模型与场景)

核心类作用说明

  1. osg::Texture1D:一维纹理的核心实现类,继承自 osg::Texture,封装了 1D 纹理的创建、绑定、参数配置等所有底层逻辑。
  2. osg::Image:一维纹理的数据载体,必须分配为「宽度任意、高度=1、深度=1」的格式。
  3. osg::TexGen:自动纹理坐标生成器,无需手动为模型顶点赋值纹理坐标,直接按坐标轴生成映射关系。
  4. 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)

总结

Texture1D 是 OSG 中轻量化、高效率的纹理方案,通过清晰的类继承架构和简洁的 API,可快速实现三维模型的线性渐变、数据映射等渲染效果。

本文提供的代码覆盖了 一维纹理创建、参数配置、坐标生成、场景渲染 全流程,结合类继承关系的解析,能帮助你彻底理解 Texture1D 的底层逻辑,可直接应用于车载仿真、科学可视化、三维建模等实际开发场景。


在这里插入图片描述

Logo

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

更多推荐