[原][資料整理][osg]osgDB文件讀取插件,工作機制,支持格式,自定義插件


參考:

osgPlugins相關

osg讀取文件的原理(插件工作機制)

當使用osgDB讀取文件時,會自動根據文件的擴展名來到插件目錄中尋找相應的插件,來實現。

比如:

osgviewer cow.osg

調用了osgdb_osg插件去讀*.osg文件。 

osgviewer model.flt

調用了osgdb_flt插件去讀*.flt文件。 

 

使用代碼我們是使用如下代碼讀取寫入模型:

//讀取
#include <osgDB/ReadFile>

osg::ref_ptr<Node> node = osgDB::readNodeFile("cow.osg");
osg::ref_ptr<Image> image = osgDB::readImageFile("lz.rgb");

//保存
#include <osgDB/WriteFile>
osgDB::writeNodeFile(*node, "saved.osg");

 

使用OSG插件是用戶無需過分關心的事情,機制已經建立,當讀某文件時,它會自己去尋找相應的插件,當你需要讀定特文件的時候,就要確認這個文件的插件是否存在,如果不存在需要編譯。

OSG支持的模型類型

Plugin name

Description

Extensions

Read

Write

Notes

3dc

3DC point cloud reader

.3dc .asc

yes

no

 

3ds

3D Studio

.3ds

yes

yes

 

ac3d

AC3D modeler

.ac

yes

yes

http://www.inivis.com/

bsp

Quake3 BSP

.bsp

yes

no

 

dae

COLLADA 1.4.x

.dae

yes

yes

Requires Collada DOM library. See Collada plugin details

dw

Design Workshop Database

.dw

yes

no

 

dxf

Autodesk DXF Reader

.dxf

yes

no

 

fbx

Autodesk FBX

.fbx

yes

yes

Requires Autodesk's FBX SDK. If using OpenSceneGraph 2.8.x you'll need version 2010.2 of the SDK. Otherwise checkReaderWriterFBX.h to see which version of the SDK is required (currently 2012.1). If you have problems loading an FBX model please check that it works in Autodesk's FBX QuickTime Viewer first to see if the model was correctly exported.

geo

Geo

.gem .geo

yes

no

 

Inventor

Open Inventor format

.iv .wrl

yes

yes

.wrl Only VRML1.0

ive

Native osg binary

.ive

yes

yes

May also read/write (internal) images

logo

Logo database

.logo

yes

no

 

lwo

Lightwave Object

.lwo .lw .geo

yes

no

 

lws

Lightwave Scene

.lws

yes

no

 

md2

Quake MD2

.md2

yes

no

 

obj

Alias Wavefront

.obj

yes

yes

Also writes materials to .mtl

ogr

 

.ogr

yes

no

 

Openflight

Multigen Openflight

.flt

yes

yes

See OpenFlight plugin details

osg

Native osg ascii

.osg

yes

yes

Currently the writer supports OVERRIDE/PROTECTED flags in "StateSets" only for "Modes" and not for "StateAttributes".

pfb

Performer loader

All extensions supported by Performer loaders

yes

no

Requires Performer library

shp

ESRI Shapefile

.shp

yes

no

 

stl

Stereolithography file

.stl .sta

yes

no

 

vrml

VRML2

.wrl

yes

no

Requires OpenVRML library

x

DirectX 3D model

.x

yes

no

 

圖片和視頻

Plugin name

Description

Extensions

Read

Write

Notes

bmp

Window bitmap

.bmp

yes

yes

 

dds

DirectX image format

.dds

yes

yes

 

gdal

GDAL image loaders

All extensions supported by GDAL

yes

no

 

gif

GIF Image

.gif

yes

no

 

hdr

High Dynamic Range image

.hdr

yes

yes

 

jp2

 

.jps .jpc

yes

yes

 

jpeg

Jpeg image

.jpeg .jpg

yes

yes

 

Openflight

Image attribute files

.attr

yes

yes

Stores additional attributes that are not stored in .rgb files

pic

PIC image

.pic

yes

no

 

png

Portable Network Graphics

.png

yes

yes

 

pnm

 

.pnm. ppm .pgm .pbm

yes

yes

 

rgb

 

.rgb .sgi .rgba .int .inta .bw

yes

yes

 

tga

Targa image

.tga

yes

no

 

tiff

Tiff image

.tiff .tif

yes

yes

 

quicktime

Quicktime movie loader

.mov .mpg .mpv .mp4 .m4v .dc .avi .flv .swf

yes

yes

 
 

Quicktime image loader

rgb. rgba .jpg .jpeg .tif .tiff .gif .png .pict .pct .tga .psd

yes

yes

 

xine

Xine image stream

.mpg .mpv .db .flv .mov .avi .wmv. xine

yes

no

 

壓縮以及網絡傳輸類型

Plugin name

Description

Extensions

Read

Write

Notes

curl

HTTP Protocol Model

.curl

yes

no

 

osga

         

txp

Terrapage file

.txp

yes

no

Produced by Terra Vista terrain building tools

net

         

zip

         

tgz

         

osgtgz

         

字體類型

Plugin name

Description

Extensions

Read

Write

Notes

freetype

Freetype font loader

.ttf .ttc .pfb .pfa .cid .cff .cef .fon .fnt

yes

no

 

txf

GLU texture font

.txf

yes

no

 

加載時可以顯式加的矩陣操作

Plugin name

Description

Extensions

Read

Write

Notes

rot

Rotates to the loaded model

.rot

     

scale

Scales the loaded model

.scale

     

trans

Translates the loaded model

.trans

     

normals

Shows normals of the loaded model

.normals

     

 

以下來源:圖形碼農

osgDB負責維護插件的信息注冊表,並負責檢查將要被載入的OSG插件接口的合法性。

應用程序從文件中讀取各部分數據庫信息時,需要在不干擾當前渲染的前提下以后台線程的方式進行。

osgDB::DatabaseParger提供了這樣的功能。

插件的工作機制

osg插件是一組動態鏈接庫,其中實現了osgDB頭文件ReaderWriter定義的接口。OSG不可能查找並加載所有的插件以獲取它們支持的文件格式,這樣,在程序啟動時將會是一個很大的開銷。因此,OSG使用職責鏈(Chain of Responsibility)的設計模式,以加載盡量少的插件。當用戶程序嘗試使用osgDB讀取或寫入文件時,OSG將按照如下步驟來查找合適的插件。

  1. OSG搜索已注冊的插件列表,查找支持文件格式的插件。開始時已注冊插件列表僅包含了Registry類構造函數中注冊的插件。如果OSG找到了可以支持此文件格式的插件,並成功執行了I/O操作,那么它將返回相應的數據。
  2. 如果沒有發現可以支持此格式的已注冊插件,或者I/0操作失敗,那么OSG將根據前面所述的文件命名規則創建插件文件的名稱,並嘗試讀取相應的插件庫。如果讀取成功,OSG將添加此插件到已注冊插件列表中。
  3. OSG將重復步驟(1),如果文件I/O的操作再次失敗,OSG將返回失敗信息。

總的來說,用戶不必了解OSG內部如何實現文件I/O操作,就可以使用插件順利工作。反之,如果文件I/O操作失敗,用戶也可以根據給出的錯誤信息跟蹤插件源代碼中的相關內容。其在程序中代碼的實現順序如下圖所示:


主要的實現的代碼是在ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)函數中

ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)
{
    // first attempt to load the file from existing ReaderWriter's
    //看是否有可用的ReaderWriter,對當前的數據進行解析,如果解析成功,就返回結果
    AvailableReaderWriterIterator itr(_rwList, _pluginMutex);
    for(;itr.valid();++itr)
    {
        ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
        if (readFunctor.isValid(rr)) return rr;
        else results.push_back(rr);
    }
 
 
    // now look for a plug-in to load the file. 
    //根據文件名稱創建新的動態庫名稱,然后加載動態庫,增加_rwList對象個數
    std::string libraryName = createLibraryNameForFile(readFunctor._filename);
    if (loadLibrary(libraryName)!=NOT_LOADED)
    {
        //重新遍歷一下,使用新的ReaderWriter進行數據的解析
        for(;itr.valid();++itr)
        {
            ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
            if (readFunctor.isValid(rr)) return rr;
            else results.push_back(rr);
        }
    }
}

 

自定義文件插件:

自定義文件插件主要是自定義一個插件讀寫類,繼承osgDB::ReaderWriter類,然后根據需求重寫如readNode等函數方法即可

 

在建立插件讀寫類時需要注意:

  • 需要建立一個dll項目工程,輸出的dll必須為osgdb_擴展名.dll或osgdb_擴展名d.dll的形式
  • 為了實現插件注冊,需要定義全局變量,方法如下REGISTER_OSGPLUGIN(VR, ReaderWriterVR),在該全局變量的初始化過程中,會使用Registery::addReaderWriter函數自動注冊插件所對應的擴展名。
  • 在應用程序使用中,需要注冊插件,方法如下 osgDB::Registry::instance->addFileExtensionAlias("VR", "VR")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM