DirectX 3D 绘制四角椎体并进行纹理贴图(顶点缓存的方式)

D3D第四章知识点,纹理贴图

通过顶点缓存的方式绘制一个四角椎体,然后给四角椎体进行相应的纹理贴图,如下是沿y轴旋转的效果。

 

主要功能代码和详细注释如下:


// 绘制椎体同时给椎体贴图,并围绕y轴旋转的工程


列出相关定义
IDirect3DDevice9* Device = 0; 
IDirect3DVertexBuffer9* Pyramid = 0; //定义椎体信息
IDirect3DTexture9*      Tex = 0;  //定义贴图信息

float Tx = 0.0f;//平移变量
float Rx = 0;//旋转变量

float Sx = 1;//缩放变量

D3DXMATRIX matrix;

创建结构体,包括顶点位置信息,法向量信息,以及顶点纹理坐标信息
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
static const DWORD FVF;
};

const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

先创建顶点缓存,因为4个面,所以开辟12个顶点缓存
Device->CreateVertexBuffer(
12 * sizeof(Vertex),
D3DUSAGE_WRITEONLY,
Vertex::FVF,
D3DPOOL_MANAGED,
&Pyramid,
0);
     Vertex* v;

     Pyramid->Lock(0, 0, (void**)&v, 0);

顶点信息,前三个顶点信息是顶点的位置信息,中间三个是顶点的法向量信息,后面两个是顶点的纹理坐标信息
v[0] = Vertex(-1.0f, 0.0f, -1.0f,0.0f,0.707f,-0.707f,0.0f,0.0f);
v[1] = Vertex( 0.0f, 1.0f, 0.0f, 0.0f, 0.707f, -0.707f,0.5f,0.5f);
v[2] = Vertex( 1.0f, 0.0f, -1.0f, 0.0f, 0.707f, -0.707f,0.0f,1.0f);

v[3] = Vertex(-1.0f, 0.0f, 1.0f, -0.707f, 0.0f, 0.707f, 0.0f, 0.0f);
v[4] = Vertex(0.0f, 1.0f, 0.0f,  -0.707f, 0.0f, 0.707f, 0.5f, 0.5f);
v[5] = Vertex(-1.0f, 0.0f, -1.0f, -0.707f, 0.0f, 0.707f, 1.0f, 0.0f);

v[6] = Vertex(1.0f, 0.0f, -1.0f, 0.707f, 0.707f, 0.0f, 0.0f, 1.0f);
v[7] = Vertex(0.0f, 1.0f, 0.0f,0.707f, 0.707f, 0.0f, 0.5f, 0.5f);
v[8] = Vertex(1.0f, 0.0f, 1.0f,0.707f, 0.707f, 0.0f, 1.0f, 1.0f);

v[9] = Vertex(1.0f, 0.0f, 1.0f, 0.0f, 0.707f, 0.707f, 1.0f, 1.0f);
v[10] = Vertex(0.0f, 1.0f, 0.0f, 0.0f, 0.707f, 0.707f, 0.5f, 0.5f);
v[11] = Vertex(-1.0f, 0.0f, 1.0f, 0.0f, 0.707f, 0.707f, 1.0f, 0.0f);

Pyramid->Unlock();

这里着重说明一下顶点信息,看图

左上角为纹理贴图及其相应的顶点纹理坐标,可知四个三角面均共用一个顶点,(0.5,0.5)。

右边的为椎体的实体模型,根据相应的位置信息分别对应绘制四个三角面,上述代码先绘制的就是红色的背后的三角面。

纹理顶点坐标根据右手法则计算。

导入绘制纹理图片的代码,图片文件需要在cpp文件目录下
D3DXCreateTextureFromFile(
Device,
"four.jpg",
&Tex);

Device->SetTexture(0, Tex);

Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

取景变换
D3DXMatrixTranslation(&matrix, Tx, 0, 0);
Device->SetTransform(D3DTS_WORLD, &matrix);


D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position, &target, &up);
Device->SetTransform(D3DTS_VIEW, &V);


//关闭光照效果,否则没有定义光照信息,物体会呈现黑色
Device->SetRenderState(D3DRS_LIGHTING, false);
return true;

}

投影变换
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.5f, // 90 - degree
640/ 480,
1.0f,
1000.0f);

Device->SetTransform(D3DTS_PROJECTION, &proj);

释放存储空间,这里释放纹理贴图信息和椎体信息
 d3d::Release<IDirect3DVertexBuffer9*>(Pyramid);

 d3d::Release<IDirect3DTexture9*>(Tex);

绘制椎体的代码
Device->BeginScene();

//绘制椎体的操作,4个面
Device->SetStreamSource(0, Pyramid, 0, sizeof(Vertex));
Device->SetFVF(Vertex::FVF);
                Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);//这里的三角面数为4

        Device->EndScene();

绘制出的椎体围绕y轴旋转
                static float Ry = 0;
D3DXMATRIX m;
D3DXMatrixRotationY(&m,Ry);
Device->SetTransform(D3DTS_WORLD,&m);

Ry += timeDelta;

上述是绘制的主要代码,如有需要原工程请点击  https://download.csdn.net/download/xiaosonghhh/10348677

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值