本文主要参考的是http://www.ogre3d.org/tikiwiki/HLSL&structure=Cookbook,并据此写了一个在Ogre中使用HLSL的例子。在Ogre中使用HLSL主要分为三部分,首先是材质脚本的编写,其次是顶点shader和片段shader的编写,最后是在应用程序中使用以上程序。我这个例子的功能是将一个模型赋予纹理贴图。详细的就不解释了,看参考的网址即可,主要是注意shader程序在各个文件之间的对应关系及版本问题(如vs_1_1和ps_1_1)。
材质脚本(wrinkle.material)是这样子的:
- vertex_program wrinkle_vs hlsl
- {
- source wrinkles.hlsl
- entry_point wrinkle_vs
- target vs_1_1
- default_params
- {
- param_named_auto worldViewProj worldviewproj_matrix
- }
- }
- fragment_program wrinkle_fs hlsl
- {
- source wrinkles.hlsl
- entry_point wrinkle_fs
- target ps_2_0
- }
- material hlsl_test
- {
- technique
- {
- pass
- {
- vertex_program_ref wrinkle_vs
- {
- }
- fragment_program_ref wrinkle_fs
- {
- }
- texture_unit
- {
- texture terr_rock6.jpg
- }
- }
- }
- }
- void wrinkle_vs(
- float4 position : POSITION,
- out float4 oPosition : POSITION,
- float2 uv : TEXCOORD0,
- out float2 oUv : TEXCOORD0,
- uniform float4x4 worldViewProj)
- {
- oPosition = mul(worldViewProj, position);
- oUv = uv;
- }
- float4 wrinkle_fs(
- float2 uv : TEXCOORD0,
- uniform sampler2D tex) : COLOR
- {
- return tex2D(tex, uv);
- }
- Ogre::SceneNode* mModelNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("ModelNode");
- Ogre::Entity* mModel = mSceneMgr->createEntity("MyModel", "model.mesh");
- mModel->setMaterialName("hlsl_test");
- mModelNode->attachObject(mModel);