2011-11-18 1 views
3

Salut J'ai un problème pendant que j'essaie de créer une texture dynamique à affecter comme arrière-plan dans ma fenêtre d'ogre. Je veux assigner des valeurs de façon dynamique pour chaque pixel de texture et ensuite j'utilise cette texture comme arrière-plan. J'utilise ce code pour créer une texture dynamique.obtenir un mauvais RVB lors de la création de texture dynamique dans OGRE

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(); 

dans ce morceau de code I classer bleu (R: 0 G: 0 B: 255) pour chaque valeur. Je m'attends à obtenir plein de fenêtre bleue mais au lieu de fond bleu j'obtiens ce fond que l'on voit dans l'image. Au lieu de l'arrière-plan bleu, dans la texture que j'obtiens, il y a 3 types de couleurs différents et ils sont toujours répétés par la suite. Les pixels bleus sont vrais mais les 2 autres couleurs seraient bleues. Je ne peux pas trouver la raison qui cause ce problème. Que puis-je faire? Qu'est-ce qu'une mauvaise partie?

+1

Je n'utilise pas ogre mais vous autorisez pour le canal transparent ARVB? On dirait que vous avez besoin d'un supplément * pDest ++ = 0 – Christopher

+0

@Christopher Semble très probable, surtout en regardant le motif répétitif. –

+0

mais au début je crée la texture avec PF_R8G8B8 donc je n'ai pas de canal alpha. le premier pixel est vrai qui est bleu mais deux pixels de suivi faux. va comme ça ensuite – barzos

Répondre

1

Selon le commentaire de Christopher:

Je n'ai aucune expérience avec Ogre3D, mais peut-il qu'il vous donne en fait les données d'image RGBA (ou BGRA, ou ARVB) au lieu de simplement RVB. Donc, vous manquez un pDest++ supplémentaire (ou peut-être *pDest++ = 255) et donc dans la première boucle d'interation vous obtenez bleu, puis vert, puis rouge, puis encore bleu, ..., qui coïnciderait en quelque sorte avec votre image montrée.

EDIT: Dans votre commentaire, vous dites (si j'ai bien compris) que vous obtenez une image complètement rouge lorsque vous ajoutez un ++pDest supplémentaire dans la boucle. Cela nous indique au moins que vous avez en effet une image à 4 composants d'Ogre3D, car nous ne sommes plus en phase avec les couleurs et n'avons plus qu'une seule couleur. Mais puisque cette couleur est rouge, il semble que Ogre3D vous donne les données d'image en tant que BGRA. Il suffit donc de définir le premier composant à 255 au lieu du troisième (et bien sûr garder ce ++pDest supplémentaire là).

Vous avez peut-être spécifié la texture comme PF_R8G8B8, mais il semble que Ogre3D ait une certaine liberté concernant la disposition des données d'image dans le tampon et que le pilote graphique ait également une certaine liberté concernant la mise en mémoire des textures. L'image RGBA ou BGRA en bits présente certains avantages par rapport au RVB 24 bits.

Cela peut également dépendre de quelle API graphique sous-jacente (D3D ou GL) est utilisée par Ogre3D et quelle est la norme là-bas. Dans GL, par exemple, vous ne pouvez pas mapper la mémoire de texture directement et devez utiliser un PBO pour cela, dont la disposition de la mémoire peut à son tour être choisie différente de la texture. Je ne connais pas D3D, mais je pense que D3D aime particulièrement la mise en page BGRA.

EDIT: Vous pouvez également vérifier pixelBox.format pour voir quel format les données ont.

+0

Je définis une texture avec PF_R8G8B8. Comme vous le dites, j'ajoute un pDest ++ supplémentaire en tant que quatrième itération, mais je n'ai assigné aucune valeur au quatrième pDest ++. A ce moment j'obtiens plein d'image rouge qu'en fait ce serait l'image bleue. De cette façon, je reçois une image complètement fausse. Quel est ton consseille ? J'ai besoin d'aide – barzos

+0

@barzos Mise à jour de ma réponse. Il semble que vous obtenez les données d'image en tant que BGRA. –

1

J'avais rencontré le même problème comme ceci.

La texture que vous avez créée était au format Ogre::PF_R8G8B8, mais le véritable hardwarebuffer qu'Ogre utilise est toujours Ogre::PF_R8G8B8A8, ce qui signifie que c'est 4 bits plutôt que 3 bits.

Vous pouvez ajouter une autre ligne dans votre boucle:

pDest++; 
Questions connexes