Ogre中使用HLSL的一个例子

来源:互联网 发布:网络系统集成中的软件 编辑:程序博客网 时间:2024/05/20 02:21

本文主要参考的是http://www.ogre3d.org/tikiwiki/HLSL&structure=Cookbook,并据此写了一个在Ogre中使用HLSL的例子。在Ogre中使用HLSL主要分为三部分,首先是材质脚本的编写,其次是顶点shader和片段shader的编写,最后是在应用程序中使用以上程序。我这个例子的功能是将一个模型赋予纹理贴图。详细的就不解释了,看参考的网址即可,主要是注意shader程序在各个文件之间的对应关系及版本问题(如vs_1_1和ps_1_1)。

材质脚本(wrinkle.material)是这样子的:

[cpp] view plaincopy
  1. vertex_program wrinkle_vs hlsl  
  2. {  
  3.     source wrinkles.hlsl  
  4.     entry_point wrinkle_vs  
  5.     target vs_1_1  
  6.   
  7.     default_params  
  8.     {  
  9.         param_named_auto worldViewProj worldviewproj_matrix  
  10.     }  
  11. }  
  12.   
  13. fragment_program wrinkle_fs hlsl  
  14. {  
  15.     source wrinkles.hlsl  
  16.     entry_point wrinkle_fs  
  17.     target ps_2_0  
  18. }  
  19.   
  20. material hlsl_test  
  21. {  
  22.     technique   
  23.     {  
  24.         pass  
  25.         {  
  26.             vertex_program_ref wrinkle_vs  
  27.             {  
  28.             }  
  29.   
  30.             fragment_program_ref wrinkle_fs  
  31.             {  
  32.             }  
  33.   
  34.             texture_unit  
  35.             {  
  36.                 texture terr_rock6.jpg  
  37.             }  
  38.         }  
  39.     }  
  40. }  
顶点shader和片段shader(wrinkles.hlsl)如下:

[cpp] view plaincopy
  1. void wrinkle_vs(  
  2.              float4 position  : POSITION,  
  3.          out float4 oPosition : POSITION,  
  4.              float2 uv  : TEXCOORD0,  
  5.          out float2 oUv : TEXCOORD0,  
  6.          uniform float4x4 worldViewProj)  
  7. {  
  8.     oPosition = mul(worldViewProj, position);  
  9.     oUv       = uv;  
  10. }  
  11.   
  12. float4 wrinkle_fs(  
  13.          float2 uv : TEXCOORD0,  
  14.          uniform sampler2D tex) : COLOR  
  15. {  
  16.     return tex2D(tex, uv);  
  17. }  
程序中调用时

[cpp] view plaincopy
  1. Ogre::SceneNode* mModelNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("ModelNode");  
  2. Ogre::Entity* mModel = mSceneMgr->createEntity("MyModel""model.mesh");  
  3. mModel->setMaterialName("hlsl_test");  
  4. mModelNode->attachObject(mModel);  
程序运行结果如下所示:

0 0
原创粉丝点击