今天新开了博客,甚是喜悦,作为菜鸟,无以为写的东西。恰好今天应友人所托,帮忙在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为你实体,或者平面什么的的指针)就行了。
我这里是程序里做了一个平面,效果如下:
(正面效果图)
(背面效果图)
。。。。以后慢慢来。。。。。。