嗨,我在尝试创建动态纹理以在我的食人魔窗口中指定为背景时遇到问题。我想为纹理的每个像素动态分配值,然后将此纹理用作背景。我使用此代码创建动态纹理。
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 种颜色也是蓝色的。我找不到导致此问题的原因。我能做些什么?什么是错误的部分?