【OSG学习笔记】Day 8: 纹理贴图——赋予模型细节
在 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