ogre render to texture 设置透明

这个问题其实就是 rtt+texture设置透明

代码如下

代码
Ogre::TexturePtr rtt_texture = Ogre::TextureManager::getSingleton().createManual("RttTex", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
Ogre::TEX_TYPE_2D, mWindow
->getWidth(), mWindow->getHeight(), 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);

Ogre::RenderTexture
*renderTexture = rtt_texture->getBuffer()->getRenderTarget();

renderTexture
->addViewport(mCamera);
renderTexture
->getViewport(0)->setClearEveryFrame(true);
renderTexture
->getViewport(0)->setBackgroundColour(Ogre::ColourValue::Black);
renderTexture
->getViewport(0)->setOverlaysEnabled(false);


renderTexture
->update();
renderTexture
->writeContentsToFile("start.png");

mMiniScreen
= new Ogre::Rectangle2D(true);
mMiniScreen
->setCorners(0.5f, -0.5f, 1.0f, -1.0f);
mMiniScreen
->setBoundingBox(Ogre::AxisAlignedBox(-100000.0f * Ogre::Vector3::UNIT_SCALE, 100000.0f * Ogre::Vector3::UNIT_SCALE));


Ogre::SceneNode
* miniScreenNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("MiniScreenNode");

miniScreenNode
->attachObject(mMiniScreen);

Ogre::MaterialPtr renderMaterial
= Ogre::MaterialManager::getSingleton().create("RttMat", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
Ogre::Technique
* matTechnique = renderMaterial->createTechnique();
matTechnique
->createPass();
renderMaterial
->getTechnique(0)->getPass(0)->setLightingEnabled(false);
renderMaterial
->getTechnique(0)->getPass(0)->createTextureUnitState("RttTex");

renderMaterial
->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);//SBT_TRANSPARENT_COLOUR

//material->getTechnique(0)->getPass(0)->setTransparentSortingEnabled(true);

renderMaterial
->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_MANUAL,1.0, 0.1); // 0.8为透明度

mMiniScreen
->setMaterial("RttMat");
代码
Ogre::TexturePtr rtt_texture = Ogre::TextureManager::getSingleton().createManual("RttTex", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
Ogre::TEX_TYPE_2D, mWindow
->getWidth(), mWindow->getHeight(), 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);

Ogre::RenderTexture
*renderTexture = rtt_texture->getBuffer()->getRenderTarget();

renderTexture
->addViewport(mCamera);
renderTexture
->getViewport(0)->setClearEveryFrame(true);
renderTexture
->getViewport(0)->setBackgroundColour(Ogre::ColourValue::Black);
renderTexture
->getViewport(0)->setOverlaysEnabled(false);


renderTexture
->update();
renderTexture
->writeContentsToFile("start.png");

mMiniScreen
= new Ogre::Rectangle2D(true);
mMiniScreen
->setCorners(0.5f, -0.5f, 1.0f, -1.0f);
mMiniScreen
->setBoundingBox(Ogre::AxisAlignedBox(-100000.0f * Ogre::Vector3::UNIT_SCALE, 100000.0f * Ogre::Vector3::UNIT_SCALE));


Ogre::SceneNode
* miniScreenNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("MiniScreenNode");

miniScreenNode
->attachObject(mMiniScreen);

Ogre::MaterialPtr renderMaterial
= Ogre::MaterialManager::getSingleton().create("RttMat", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
Ogre::Technique
* matTechnique = renderMaterial->createTechnique();
matTechnique
->createPass();
renderMaterial
->getTechnique(0)->getPass(0)->setLightingEnabled(false);
renderMaterial
->getTechnique(0)->getPass(0)->createTextureUnitState("RttTex");

renderMaterial
->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);//SBT_TRANSPARENT_COLOUR

//material->getTechnique(0)->getPass(0)->setTransparentSortingEnabled(true);

renderMaterial
->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_MANUAL,1.0, 0.1); // 0.8为透明度

mMiniScreen
->setMaterial("RttMat");

终于会插入代码了 不用一点点 回车了 。。

这段内容比较多 除了 取出rtt 设置 透明 还有些别的内容

这段内容 是单独设置纹理透明的:

方法一 材质脚本模板:

material Template/TransparentTexture
 {
   technique
   {
     pass
     {
       lighting off
       scene_blend alpha_blend
       depth_write off
 
       texture_unit
       {
         texture image.png
         alpha_op_ex source1 src_manual src_texture 0.5      
       }
     }
   }
 }
 
方法二 程序代码:

material->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);//SBT_TRANSPARENT_COLOUR

//material->getTechnique(0)->getPass(0)->setTransparentSortingEnabled(true);

material->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_MANUAL,1.0, 0.8); // 0.8为透明度
原文地址:https://www.cnblogs.com/minggoddess/p/1909472.html