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