3

C++ と OSG を使用して、float テクスチャをシェーダーにアップロードしようとしていますが、うまくいかないようです。最後に、コードの一部を投稿しました。主な問題は、float 配列のデータを使用して osg::Image オブジェクトを作成する方法です。OpenGL では、目的のコードは次のようになります。

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE32F_ARB, width, height, 0, 
             GL_LUMINANCE, GL_FLOAT, data);

ただし、この場合は OSG を使用する必要があります。

使用時にコードは正常に実行されます

Image* image = osgDB::readImageFile("someImage.jpg");  

それ以外の

image = new Image;  

生成された float データをアップロードする必要があります。シェーダー コードで GL_LUMINANCE32F_ARB データ範囲が必要なため、unsigned char 配列に切り替えることもできません。

Googleが私を助けることができなかったので、誰かがここで私を助けてくれることを願っています(例:osg float imageをグーグルで検索)。だからここに私のコードがあります。

using namespace std;
using namespace osg;
//...
float* data = new float[width*height];
fill_n(data, size, 1.0); // << I actually do this for testing purposes
Texture2D* texture = new Texture2D;
Image* image = new Image;
osg::State* state = new osg::State;
Uniform* uniform = new Uniform(Uniform::SAMPLER_2D, "texUniform");
texture->setInternalFormat(GL_LUMINANCE32F_ARB);
texture->setDataVariance(osg::Object::DYNAMIC);
texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
texture->setWrap(osg::Texture2D::WRAP_T, osg::Texture2D::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture2D::WRAP_S, osg::Texture2D::CLAMP_TO_EDGE);
if (data == NULL)
  cout << "texdata null" << endl; // << this is not printed
image->setImage(width, height, 1, GL_LUMINANCE32F_ARB,
                GL_LUMINANCE, GL_FLOAT,
                (unsigned char*)data, osg::Image::USE_NEW_DELETE);
if (image->getDataPointer() == NULL)
  cout << "datapointernull" << endl; // << this is printed
if (!image->valid())
  exit(1); //  << here the code exits (hard exit just for testing purposes)
osgDB::writeImageFile(*image, "blah.png");
texture->setInternalFormat(GL_LUMINANCE32F_ARB);
texture->setImage(image);
camera->getOrCreateStateSet()->setTextureAttributeAndModes(4, texture);
state->setActiveTextureUnit(4);
texture->apply(*state);
uniform->set(4);
addProgrammUniform(uniform);

osg::Image でデータを作成し、後で入力できるようにする別の方法を Web で見つけました。しかし、どういうわけかこれも機能しません。これを新しい XYZ の直後に挿入しました。行。

image->setInternalTextureFormat(GL_LUMINANCE32F_ARB);
image->allocateImage(width,height,1,GL_LUMINANCE,GL_FLOAT);
if (image->data() == NULL)
  cout << "null here?!" << endl; // << this is printed.
4

2 に答える 2

1

次の (簡略化された) コードを使用して、浮動小数点テクスチャを作成および設定します。

// Create texture and image
osg::Texture* texture = new osg::Texture2D;
osg::Image* image = new osg::Image();
image->allocateImage(size, size, 1, GL_LUMINANCE, GL_FLOAT);
texture->setInternalFormat(GL_LUMINANCE32F_ARB);
texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
texture->setImage(image);

// Set texture to node
osg::StateSet* stateSet = node->getOrCreateStateSet();
stateSet->setTextureAttributeAndModes(TEXTURE_UNIT_NUMBER, texture);

// Set data
float* data = reinterpret_cast<float*>(image->data());
/* ...data processing... */
image->dirty();

一部のパラメーターを変更したい場合がありますが、これで開始できます。あなたの場合TEXTURE_UNIT_NUMBERは4に設定する必要があると思います。

于 2013-07-16T07:48:57.103 に答える