Ogre中实现 几何面正反面不同纹理贴图

 

    首先,我的实现是在OpenGL平台下的。主要是借助GLSL shader语言,在shader中判断是几何面的正面还是反面,然后贴上不同的纹理。最初是在RenderMonkey里实现的,要实现此,需要设置Render State的GL_CullMode为NONE。下面给出很简单shader代码,超级简单,不要见笑。

   首先,顶点shader:

varying vec2 Texcoord;

void main( void )

{
     Texcoord = gl_MultiTexCoord0.xy;  

     gl_Position = ftransform();

}

然后是片段shader:


uniform sampler2D baseMap;

uniform sampler2D baseMap1;

varying vec2 Texcoord;

void main( void )

 if(gl_FrontFacing)  

 gl_FragColor=texture2D( baseMap1, Texcoord );    

else  

 gl_FragColor=texture2D(baseMap,Texcoord);

}

   怎么样,确实够简单吧,这里代码本身不做过多解释。这里主要借助了GLSL的只读内置变量gl_FrontFacing,这个变量当是多边形正面的时候值为true,反面的时候为false,至于什么时候是正面还是反面主要看你的顶点顺序了。。

   开始也说了是在Ogre中实现的,我的做法是将shader写入Ogre的材质脚本。

   上面的顶点shader保存为Twotexture.vert (当然名字你可以自己指定,,,后面的材质脚本里做相应更改就是了),片段shader保存为TwoTexture.frag。然后在写一个Ogre的材质脚本,可命名为TwoSideTexTure.material,脚本的全部内容如下:


vertex_program GLSL/TwoTextureVS glsl
{
 source TwoTexture.vert
 default_params
 {
 }
}

fragment_program GLSL/TwoTextureFS glsl
{
 source TwoTexture.frag
 default_params
 {
   param_named baseMap int 0
      param_named baseMap1 int 1
 }
}

material TwoTexture
{
 technique
 {
  pass
  {
     cull_hardware none
   vertex_program_ref GLSL/TwoTextureVS
   {
   }

   fragment_program_ref GLSL/TwoTextureFS
   {
   }

   texture_unit
   {
    texture T1.jpg
    filtering linear linear none
    tex_address_mode wrap
   }
   texture_unit
   {
    texture T2.jpg
    filtering linear linear none
    tex_address_mode wrap
   }

  }

 }

}

当然media里你要提供两张图片T1.jpg,T1.jpg(也可以其他命名,material里做相应的更改)

 然后程序里你将此材质entityPtr->setMaterialName("TwoTexture");(entityPtr为你实体,或者平面什么的的指针)就行了。

   我这里是程序里做了一个平面,效果如下:

Ogre中实现 几何面正反面不同纹理贴图_第1张图片(正面效果图)Ogre中实现 几何面正反面不同纹理贴图_第2张图片(背面效果图)

。。。。以后慢慢来。。。。。。

你可能感兴趣的:(脚本,语言,平台,shader)