今天写了一个NormapXModel类,用来创建带有法线贴图效果的模型。在写完之后还是发现类的封装有很多不合理的地方。
#pragma once
#include <windows.h>
#include <d3dx9.h>
#include <strsafe.h>
#include "Util.h"
class NormapXModel
{
public:
LPDIRECT3DDEVICE9 pd3dDevice;
LPD3DXMESH mesh; //载入时用到
ID3DXMesh* finalMesh; //接收最后指定格式的mesh
D3DMATERIAL9* materials;
LPDIRECT3DTEXTURE9* textures;
IDirect3DTexture9* normaps;
DWORD materialNum;
D3DXMATRIX worldMatrix; //世界矩阵
D3DXVECTOR3 position; //位置
D3DXVECTOR3 rotation; //旋转
char* filename; //文件名
float scale; //缩放
ID3DXEffect* effect;
public:
NormapXModel(LPDIRECT3DDEVICE9 _pd3dDevice, char* _filename,char* _normapFilename);
~NormapXModel();
int Load();
void SetupMatrices();
void Render();
void Render(D3DXHANDLE* _textureHandle=0,D3DXHANDLE* _materialHandle=0,D3DXHANDLE* _normapHandle=0);
void SetPosition(D3DXVECTOR3 _position);
void Destory();
D3DXMATRIX GetWorld() {return worldMatrix;}
};
因为每个模型都要有它对应的发现贴图对象:IDirect3DTexture9* normaps; 所以这个成员变量是必不可少的,其实里面多余的成员变量是 ID3DXEffect* effect; 应该将effect及其用到的参数句柄变量放在主程序里。
下面是我用shader渲染的带有法线贴图效果的iceworld(cs经典地图):
左边的墙壁上带有闪烁的反射效果,其实这面墙只有四个顶点,之所以显现出墙面的细节是因为使用了法线贴图(Normal Map)。对于程序怎么写我就不多说了,任何一本游戏编程的书上都有。我只介绍一下法线贴图的制作吧,方法有很多,有的直接用maya或3dmax制作,但是那个比较麻烦,我用的photoshop。
首先要下载photoshop cs2,一定是cs2的,因为我们要用到NVIDIA提供的插件,这个插件只针对cs2,安装cs2后就去下载插件:http://www.nvidia.cn/object/photoshop_dds_plugins.html
找到网页的最下边,下载7.83.0628版本的。然后安装的时候指定你cs2的根目录,插件安装完成。
打开cs2,随便打开一张墙壁的纹理,然后点击filter->nvidia,选择好滤镜后会出现下面的对话框,比较有用的就是Min 0 Scale 15,不同的值代表着凹凸程度,可以边调整,边点击3D preview来预览效果。
最后导出该图片就可以了,最好是保存成dds格式的。