DX中自带几何体的绘制:
为了方便,DX为我们提供了几种自带的几何体,我们就不需要定义成吨的顶点来绘制一个图形了。
常用的有几种,立方体,茶壶,柱体,球面体。
HRESULT D3DXCreateTeapot(
__in LPDIRECT3DDEVICE9 pDevice,
__out LPD3DXMESH *ppMesh,
__out LPD3DXBUFFER *ppAdjacency
);
上面是其中最简单的创建一个茶壶的代码,其余立方体与这个的创建大同小异,仅仅是在第一个参数之后加上几个尺寸的参数。
例如,我们创建一个立方体:
//生成立方体
D3DXCreateBox(
g_pDevice, //设备对象
1.0f, 1.0f, 1.0f, //X,Y,Z方向的长度
&g_pbox, //创建的对象的指针
NULL //存储绘制网格的三角形索引参数,不使用,置为NULL
);
在绘制时也很简单,只需要一句代码即可绘制:
g_pbox->DrawSubset(0);
一个Demo:
创建了一个立方体和一个茶壶,分别绕X轴旋转和Y轴旋转:
// D3DDemo.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "D3DDemo.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
// 此代码模块中包含的函数的前向声明:
HWND g_hWnd;
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//---------改造3D窗口需要的内容------------
LPDIRECT3D9 g_pD3D = NULL; //D3D接口指针
LPDIRECT3DDEVICE9 g_pDevice = NULL;//D3D设备指针
//立方体的接口
LPD3DXMESH g_pteapot = NULL;
LPD3DXMESH g_pbox = NULL;
void onCreatD3D()
{
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (!g_pD3D)
return;
//检测硬件设备能力的方法
/*D3DCAPS9 caps;
ZeroMemory(&caps, sizeof(caps));
g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);*/
//获得相关信息,屏幕大小,像素点属性
D3DDISPLAYMODE d3ddm;
ZeroMemory(&d3ddm, sizeof(d3ddm));
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
//设置全屏模式
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
/*d3dpp.Windowed = false;
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;*/
d3dpp.Windowed = true;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//交换后原缓冲区数据丢弃
//是否开启自动深度模板缓冲
d3dpp.EnableAutoDepthStencil = true;
//当前自动深度模板缓冲的格式
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//每个像素点有16位的存储空间,存储离摄像机的距离
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pDevice);
if (!g_pDevice)
return;
//设置渲染状态,设置启用深度值
g_pDevice->SetRenderState(D3DRS_ZENABLE, true);
//设置渲染状态,关闭灯光
g_pDevice->SetRenderState(D3DRS_LIGHTING, false);
//设置渲染状态,裁剪模式
g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
//g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) ;
}
void Transform()
{
//ViewTransform:取景变换
D3DXVECTOR3 vEyePt(0.0f, 0.0f, -10.0f); //摄像机世界坐标
D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f); //观察点世界坐标
D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f); //摄像机的上向量,通常为(0.0f, 1.0f, 0.0f)
D3DXMATRIXA16 matView; //View变换的矩阵
//根据上面的结果计算出矩阵,存入矩阵中
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
//进行取景变换
g_pDevice->SetTransform(D3DTS_VIEW, &matView);
//ProjectionTransform:投影变换
D3DXMATRIXA16 matProj; //投影变换矩阵
//生成投影变换矩阵,存入上面的矩阵中
D3DXMatrixPerspectiveFovLH(
&matProj, //输出结果矩阵
D3DX_PI / 4, //视域角度,一般为PI/4
1.0f, //显示屏的长宽比
1.0f, //视截体中近截面距离摄像机的位置
100.0f //视截体中远截面距离摄像机的位置
);
//进行投影变换
g_pDevice->SetT