问题4-Textrue

ncopy.gif

下面是关于D3D贴图的内容。问题很简单,就是给一个去除了上下面的立方体的内外贴图。

问题描述:

在一个窗口中显示一个没有上下底面的立方体,并且用8张图给立方体内部的4个面和外部的4个面贴图,并且让立方体保持旋转。

Textrue.jpg

首先,要用VertexBuffer和IndexBuffer建立一个没有上下底面的立方体,因为要使用贴图,贴图要使用贴图坐标,所以这里我们的Vertex结构体要修改,要加入贴图坐标(u,v),下面的图表示了一个贴图坐标。

Textrue_coordinate.jpg

然后修改我们的结构体:

struct Vertex
{
Vertex(){}
Vertex(
float x, float y, float z,
float nx, float ny, float nz,
float u, float v)
{
_x = x; _y = y; _z = z;
_nx = nx; _ny = ny; _nz = nz;
_u = u; _v = v;
}
float _x, _y, _z;
float _nx, _ny, _nz;
float _u, _v; // texture coordinates};
#define FVF_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)


要使用贴图,就还要使用D3DFVF_TEX1。

使用上面的结构构造好立方体后,就可以开始贴图了。可以使用LPDIRECT3DTEXTURE9创建一个结构体。这里要贴8张图片,所以可以创建一个数组。

LPDIRECT3DTEXTURE9* tex = NULL;
tex = new LPDIRECT3DTEXTURE9[8];


然后再使用D3DXCreateTextureFromFile载入要贴图的图片

D3DXCreateTextureFromFile(_device,L"img\\banana1.bmp",&tex[0]);

第一个参数是设备对象,第二个参数是图片的路径,第三个参数就是刚才创建的LPDIRECT3DTEXTURE9数组。

最后显示贴图的时候使用SetTexture,要一个面一个面的分别显示

_device->SetTexture(0, tex[0]);
_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 6, 0,2);


这样一直把立方体的内外8个面完成为止。

可能有同学不知道在立方体的内部怎么贴图,其实很简单,由于我们要贴8个图,所以我们要创建48个IndexBuffer ,24个在外面,24个在里面,在外面的24个我们用顺时针顺序,里面的24个只要使用反时针的顺序就可以了。比如

//外面的一面
i[0] = 0; i[1] = 1; i[2] = 2;
i[3] = 0; i[4] = 2; i[5] = 3;


//里面的一面
i[24] = 2; i[25] = 1; i[26] = 0;
i[27] = 3; i[28] = 2; i[29] = 0;


最后也要记住使用了LPDIRECT3DTEXTURE9后要释放资源。

*原创内容,转载请注明出处*


发表留言

只对管理者显示

No title

[色付きの文字]超级失败- -!没个看的懂的

No title

想和你做个朋友!!我的qq27076532
自我介绍

Author:三只熊熊
大家好,欢迎来到我的blog!
目前我正在韩国攻读游戏工学研究生,现在在虚拟现实实验室。
作为刚踏入游戏开发领域的初学者,希望大家多多帮助!

잘 부탁드립니다~ ^_^

最新文章
最新留言
最新引用
月份存档
类别
计数器
搜寻栏
RSS连结
连结
Powered By FC2博客

马上开始博客吧!!

Powered By FC2博客