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;
}







猜你喜欢

转载自blog.csdn.net/lynon/article/details/79231431