3

こんにちは、鬼のウィンドウの背景として割り当てる動的テクスチャを作成しようとしているときに問題が発生しました。テクスチャの各ピクセルに動的に値を割り当てたいので、このテクスチャを背景として使用します。このコードを使用して動的テクスチャを作成します。

Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().createManual("BackgroundTex", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 800, 600, 0, Ogre::PF_R8G8B8, Ogre:: TU_DYNAMIC);

Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create("BackgroundMat",Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
material->getTechnique(0)->getPass(0)->createTextureUnitState("BackgroundTex");
material->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_COLOUR);

Ogre::Rectangle2D* rect = new Ogre::Rectangle2D(true);
rect->setCorners(-1.0, 1.0, 1.0, -1.0);

rect->setRenderQueueGroup(Ogre::RENDER_QUEUE_BACKGROUND);
rect->setBoundingBox(Ogre::AxisAlignedBox(-100000.0 * Ogre::Vector3::UNIT_SCALE, 100000.0 * Ogre::Vector3::UNIT_SCALE));

Ogre::SceneNode* node = sceneManager->getRootSceneNode()->createChildSceneNode("BackgroundMat");
node->attachObject(rect);
node->setVisible(true);
rect->setMaterial("BackgroundMat");
Ogre::HardwarePixelBufferSharedPtr pixelBuffer = texture->getBuffer();
pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock();
Ogre::uint8* pDest = static_cast<Ogre::uint8*>(pixelBox.data);

for(size_t i=0; i < 600; i++)
{    
   for(size_t j=0; j < 800; j++)
   {    
      *pDest++ = 0;
      *pDest++ = 0;
      *pDest++ = 255;

   }
}

pixelBuffer->unlock();

このコードでは、各値に青(R:0 G:0 B:255)を割り当てます。私は青い窓でいっぱいになることを期待していますが、青い背景の代わりに、写真に見られるこの背景を取得します。 ここに画像の説明を入力してください

青い背景の代わりに、私が得たテクスチャには3つの異なる色のタイプがあり、それらは常に連続して繰り返されます。青いピクセルは真ですが、他の2色も同様に青になります。この問題の原因を見つけることができません。私に何ができる?間違った部分は何ですか?

4

2 に答える 2

2

クリストファーのコメントによると:

私は Ogre3D の経験がありませんが、実際には、RGB だけでなく RGBA (または BGRA、または ARGB) として画像データを提供するのでしょうか。pDest++したがって、追加の(またはおそらく)を見逃している*pDest++ = 255ため、最初のループの相互作用で、青、緑、赤、青の順に表示されます。これは、表示されている画像と何らかの形で一致します。

編集:あなたのコメントでは、(私が正しく理解していれば)++pDestループに追加を追加すると完全に赤い画像が得られると言っています。これで少なくとも、Ogre3D から実際に 4 成分の画像が得られることがわかります。これは、色との同期がとれておらず、単一の色しかないためです。しかし、この色は赤なので、Ogre3D は画像データを BGRA として提供しているようです。したがって、最初のコンポーネントを 3 番目のコンポーネントではなく 255 に設定します (もちろん、この追加コンポーネントを++pDestそこに保持します)。

テクスチャを として指定した可能性がありますが、PF_R8G8B8Ogre3D にはバッファ内の画像データのレイアウトに関してある程度の自由があるようで、実際にはグラフィックス ドライバにもテクスチャのメモリ レイアウトに関してある程度の自由があり、多くの場合 32 ビットの RGBA または BGRA です。 image には、24 ビット RGB よりもいくつかの利点があります。

また、Ogre3D で使用されている基礎となるグラフィックス API (D3D または GL) と、そこでの標準がどれであるかにも依存する場合があります。たとえば GL では、テクスチャ メモリを直接マップすることはできず、これには PBO を使用する必要があり、そのメモリ レイアウトはテクスチャとは別に選択できます。D3Dについては知りませんが、D3Dは特にBGRAレイアウトが好きだと思います。

編集:pixelBox.formatデータの形式を確認することもできます。

于 2011-11-18T13:44:28.573 に答える
1

私はこのような同じ問題に遭遇しました。

作成したテクスチャは の形式でしOgre::PF_R8G8B8たが、Ogre が使用している実際のハードウェア バッファはまだOgre::PF_R8G8B8A8です。つまり、3 ビットではなく 4 ビットです。

ループに別の行を追加できます。

pDest++;
于 2012-10-07T12:22:21.043 に答える