Ogre 中替换现有材质中的 shader


//test replace shader by another dynamicly
  
  const MaterialPtr &repMatPtr = m_pCBorderPanel->getMaterial();
  GpuProgramPtr pGpuProg = GpuProgramManager::getSingleton().createProgram("testReplace", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, \
   "CommonBlueFrag.glsles", \
   GPT_FRAGMENT_PROGRAM, "glsles" ); //对于glsles shader最后这里一定要填 "glsles"
  if( pGpuProg->isLoaded() )
  {
   int a = 0; //未进来
  }
  //pGpuProg->load();
  Pass *pass = repMatPtr->getTechniques()[0]->getPasses()[0];
  GpuProgramPtr pOldFragProg = pass->getFragmentProgram();
  Ogre::String oldName = pOldFragProg->getName();
  if( pOldFragProg->isLoaded() )
  {
   int a = 0; //进来了
  }
  pass->setFragmentProgram("testReplace");
  if( pOldFragProg->isLoaded() )
  {
   int a = 0; //进来了
  }
  pOldFragProg->unload();

  bool bOldExist = GpuProgramManager::getSingleton().resourceExists("testReplace");
  GpuProgramManager::getSingleton().remove("testReplace", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);



材质文件中材质定义:

// test replace shader of a pass

vertex_program Sdk/GuiSys/TestVertProgram glsles
{
    source CommonVert.glsles

    //下面这种写法可能也行
    default_params
    {
        //param_named_auto uModelViewProjection worldviewproj_matrix
    }
}

fragment_program Sdk/GuiSys/TestFragProgram glsles
{
    source CommonRedFrag.glsles
   
    default_params
    {
        param_named img int 0
        param_named lum float 1.0
    }
}

material Sdk/GuiSys/Test
{
     technique
    {
        pass
        {
           
            vertex_program_ref Sdk/GuiSys/TestVertProgram
            {
                param_named_auto uModelViewProjection worldviewproj_matrix
            }
           
            fragment_program_ref Sdk/GuiSys/TestFragProgram
            {
                //param_named img int 0
            }

            texture_unit
            {
                texture sdk_cursor.png
            }
        }
    }
}



//CommonVert.glsles:

#version 100

precision highp int;
precision highp float;

uniform mat4 uModelViewProjection;

attribute vec4 uv0;
attribute vec4 Vertex;

varying vec2 Texcoord;


void main()
{
 Texcoord = uv0.st;
 gl_Position = uModelViewProjection * Vertex;
}



//CommonRedFrag.glsles:

#version 100

precision highp int;
precision highp float;

uniform sampler2D img;
uniform float lum;

varying vec2 Texcoord;

void main()
{
 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);//texture2D(img, Texcoord) * lum;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值