在 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