zoukankan      html  css  js  c++  java
  • Ogre中实现 几何面正反面不同纹理贴图

        今天新开了博客,甚是喜悦,作为菜鸟,无以为写的东西。恰好今天应友人所托,帮忙在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为你实体,或者平面什么的的指针)就行了。

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

    (正面效果图)(背面效果图)

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

  • 相关阅读:
    浏览器
    背景图片设置
    用CSS画平行四边形
    git常用操作
    函数Function
    Object类型的创建和访问
    执行环境及作用域
    传值和传引用
    String类型
    HTML< legend >标签
  • 原文地址:https://www.cnblogs.com/lxzCode/p/1961740.html
Copyright © 2011-2022 走看看