做完了之前的render to texture那人又说他要的不是 这个 rtt完全透明 要的是 rtt的背景是透明的 那个人头不透明
看了这个链接http://www.ogre3d.org/forums/viewtopic.php?f=2&t=15257
问的google这个关键词ogre RenderTexture alpha
测试成功其实本来已经很接近了 最后 renderMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_CURRENT); 这个方法的最后一个参数用的不对 本来就不是很明白是什么意思 在挨个试验 不过这种在代码中 设置纹理 可以参考material的script 这里ogre scene_blend 透明 有具体说明 是从参考手册和网上搜来的
下面 说具体实现 做出rtt的效果 参见 中级教程rtt
可以 画出rectangle 放rentangle里也可以放 overlay或者别的什么里面
一,生成的rtt的格式是 A8R8G8B8就是说要带alpha通道
(很早就知道这一点了 但是一直不知道是怎么写入通道的 其实就是二)
二。设置此rtt的viewport的backcolor(0,0,0,0)最后一个就是alpha,想要什么程度的透明就是从这里设置的
(其实本身我做了二这步 但是不知道这个setcoulour就是写入alpha通道,回头想的时候总是很好理解的 alpha在colourvalue里面)
三,setSceneBlend的模式(Ogre::SBT_TRANSPARENT_ALPHA) 这个的意思是按照alpha遮罩去最终颜色 这里我再重申下 混合 透明是material里sceneblend这个属性控制的 里面有很多选项 基本的是 最终混合结果=要加入的纹理*参数1+已存在的纹理*参数2 而scenenblend的那四种模式都是 这个基本的方法对出来的
四。setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_CURRENT)
之前我就是这步做错了 第三个参数里用了手动模式 在后面的4.5个参数里 配置 导致之前的alpha就失效了。
这样就差不多了 以防有遗漏 上代码
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_A8R8G8B8, Ogre::TU_RENDERTARGET); Ogre::RenderTexture *renderTexture = rtt_texture->getBuffer()->getRenderTarget(); renderTexture->addViewport(mCamera); renderTexture->getViewport(0)->setClearEveryFrame(true); renderTexture->getViewport(0)->setBackgroundColour(Ogre::ColourValue(0.5f,0.5f,0.5f,0.5f)); 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_CURRENT); // 0.8为透明度 mMiniScreen->setMaterial("RttMat"); renderTexture->addListener(this); //overlay fullfill Ogre::TextureManager::getSingleton().load("droplet.png",Ogre::ResourceGroupManager :: DEFAULT_RESOURCE_GROUP_NAME); Ogre::OverlayElement *mpicture=NULL; mpicture = Ogre::OverlayManager::getSingleton().createOverlayElement("Panel","Overlay/Picture"); mpicture->setParameter("metrics_mode","pixels"); mpicture->setParameter("left","5"); mpicture->setParameter("top","50"); mpicture->setParameter("width","400"); mpicture->setParameter("height","250"); // mpicture->setMaterialName("picture/Picture"); mpicture->setMaterialName("RttMat"); Ogre::Overlay *mOverlay = Ogre::OverlayManager::getSingleton().create("Overlay"); mOverlay->add2D((Ogre::OverlayContainer*)mpicture); mOverlay->show();
里面有些没用的测试代码 挑着看