【OSG学习笔记】Day 8: 纹理贴图——赋予模型细节

发布于:2025-05-01 ⋅ 阅读:(29) ⋅ 点赞:(0)

在这里插入图片描述

在 OSG(Open Scene Graph)中,纹理贴图是为模型添加细节的关键技术,主要涉及纹理加载UV 映射多重纹理叠加三部分。

基础理论

纹理加载

纹理的作用,就是将2D图像映射到3D模型表面,增强视觉细节。

纹理类型与格式支持:

OSG 支持多种图像格式,包括常见的 .jpg/.jpeg、.png、.tga、.bmp 等,推荐使用 .png(支持透明通道)或 .dds(压缩格式,性能更优)。

代码示例

第一步:创建并加载纹理
// 创建2D纹理对象
ref_ptr<Texture2D> texture = new Texture2D;

// 从文件加载图像数据(自动识别格式)
ref_ptr<Image> image = osgDB::readImageFile("texture.png");
if (!image) {
   
    OSG_WARN << "Failed to load texture image!" << std::endl;
    return nullptr;
}

// 绑定图像到纹理
texture->setImage(image);
第二步:将纹理关联到几何体
// 创建Geode节点并绑定纹理
ref_ptr<Geode> geode = new Geode;
geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get());

// 添加几何体(如四边形)
ref_ptr<Geometry> geometry = new Geometry;
geode->addDrawable(geometry);

UV 映射原理

UV 坐标:范围为 [0, 1],用于指定纹理像素在模型表面的对应位置(U 为横向,V 为纵向)。

作用:控制纹理如何 “包裹” 模型,避免拉伸、扭曲或错位。

手动设置 UV 坐标

// 假设几何体为四边形,顶点坐标为(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)
ref_ptr<Vec3Array> vertices = new Vec3Array;
vertices->push_back(Vec3(-1, -1, 0));
vertices->push_back(Vec3(1, -1, 0));
vertices->push_back(Vec3(1, 1, 0));
vertices->push_back(Vec3(-1, 1, 0));
geometry->setVertexArray(vertices);

// 设置UV坐标(与顶点一一对应)
ref_ptr<Vec2Array> texCoords = new Vec2Array;
texCoords->push_back(Vec2(0, 0));   // 左下角对应纹理原点
texCoords->push_back(Vec2(1, 0));   // 右下角
texCoords->push_back(Vec2

网站公告

今日签到

点亮在社区的每一天
去签到