1

長方形の領域に2Dテクスチャを配置しています。これは動的テクスチャ画像(640x480)です。

tex = new osg::Texture2D;
tex->setDataVariance( osg::Object::DYNAMIC );
tex->setResizeNonPowerOfTwoHint( false );
tex->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST );
tex->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST );
tex->setImage(myImage);

私の画像データは他のスレッドで頻繁に(Nミリ秒ごとに)更新されます:

myImage->setImage(
    width,
    height,
    1,
    3,
    GL_BGR,
    gl_data_size,
    (BYTE *)newImageData,
    osg::Image::AllocationMode::USE_MALLOC_FREE
);

その後、テクスチャに設定された画像でダーティ(これが更新の最良の方法だと思った)を使用した場合、レンダリングされた画像を更新したいと思います。

// Update callback
...
myImage->dirty();
...

同じポインタで画像を置き換えるだけの場合よりも、パフォーマンスが約7〜8倍遅くなります。

// Update callback
...
tex->setImage(myImage);
...

OSGのドキュメントとガイドラインを読むと、正しい方法は-'dirty()'だと思います。しかし、それは非常に遅いです。何かを誤解していませんか、それともコードに間違いがありますか?

4

2 に答える 2

1

正しい方法は、画像でdirty()を呼び出すことです。

osg :: PixelBufferObjectを画像に追加して、グラフィックカードへの転送を高速化してみてください。

myImage->setPixelBufferObject(new osg::PixelBufferObject(myImage));
于 2012-06-15T16:02:35.200 に答える
1

Imageクラスの「ダーティ」メソッドがないため、最新(3.0.1)バージョンのOSGを使用していないと想定しています。以前のバージョン(2.x):

inline void Image::dirty()
{
    ++_modifiedCount;
    if (_bufferObject.valid())
        _bufferObject->dirty();
}

次にdirty()は、 _bufferObjectのすべてのコンパイル済みリストをリセットします。一方、setImageは次のように始まります。

void Texture2D::setImage(Image* image)
{
    if (_image == image) return;
    ...
}

したがって、画像に同じポインタを使用している場合は、何もしません。そのため高速ですが、何も変更されていない場合にOSGが実際のテクスチャを更新する方法がわかりません。

于 2012-06-13T08:56:32.773 に答える