Normap的初识

来源:互联网 发布:网页设计和淘宝美工 编辑:程序博客网 时间:2024/05/18 10:04

今天写了一个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格式的。