zoukankan      html  css  js  c++  java
  • 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为透明度
    
  • 相关阅读:
    POJ 2352 && HDU 1541 Stars (树状数组)
    SSH三大框架的工作原理及流程
    稀疏表示
    Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
    [面经] 南京SAP面试(上)
    JAVA数组的定义及用法
    花指令
    计算机认证考试种类
    《C语言编写 学生成绩管理系统》
    spice for openstack
  • 原文地址:https://www.cnblogs.com/minggoddess/p/1909472.html
Copyright © 2011-2022 走看看