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