//=============================================================================
// Desc: 最简单的Direct3D程序,
//=============================================================================
#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象
//-----------------------------------------------------------------------------
/
/ Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
//创建Direct3D对象, 该对象用来创建Direct3D设备对象
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
//创建Direct3D设备对象
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
/
/-----------------------------------------------------------------------------
// Desc: 释放创建对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
//释放Direct3D设备对象
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
//释放Direct3D对象
if( g_pD3D != NULL)
g_pD3D->Release();
}
//-----------------------------------------------------------------------------
// Desc: 渲染图形
//-----------------------------------------------------------------------------
VOID Render()
{
//清空后台缓冲区
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
//开始在后台缓冲区绘制图形
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
/
/在此在后台缓冲区绘制图形
//结束在后台缓冲区渲染图形
g_pd3dDevice->EndScene();
}
//将在后台缓冲区绘制的图形提交到前台缓冲区显示
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// Desc: 程序入口
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
//注册窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L"ClassName", NULL };
RegisterClassEx( &wc );
//创建窗口
HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序",
WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
NULL, NULL, wc.hInstance, NULL );
//初始化Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
//显示主窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
//进入消息循环
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( ssage!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render(); //渲染图形
}
}
}
UnregisterClass( L"ClassName", wc.hInstance );
return 0;
}
页面设计代码//=============================================================================
// Desc: 最简单的Direct3D程序,
/
/=============================================================================
/*
***绘制图元***==============================================
IDirect3DDevice9::DrawPrimitive
HRESULT DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex,
UINT PrimitiveCount
);
PrimitiveType 指定绘制图元的类型
StartVertex 指定顶点流起始位置
PrimitiveCount 指定绘制图元的数量
***创建顶点缓冲区***========================================
IDirect3DDevice9::CreateVertexBuffer
HRESULT CreateVertexBuffer(
UINT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool,
IDirect3DVertexBuffer9** ppVertexBuffer,
HANDLE* pHandle
);
Length 指定顶点缓冲区的大小,以字节为单位
Usage 指定顶点缓冲区属性,它可以设为 0 或如下任意组合
D3DUSAGE_DONOTCLIP 禁用裁减,表示顶点缓冲中的顶点不进行裁减,当设置该属性时,渲染状态 D3DRS_CLIPPING 必须设置为 FALSE
D3DUSAGE_DYNAMIC 顶点缓冲区使用动态内存(AGP memory)
D3DUSAGE_NPATCHES 使用顶点缓冲区绘制 N-patches 曲线
D3DUSAGE_POINTS 使用顶点缓冲区绘制点
D3DUSAGE_RTPATCHES 使用顶点缓冲区绘制曲线
D3DUSAGE_SOFTWAREPROCESSING 当设置该属性时,表示使用软件进行顶点运算,否则使用硬件进
行顶点计算
D3DUSAGE_WRITEONLY 只写属性,不能进行读操作,设置该属性可以提高系统性能
FVF 表示顶点的灵活顶点格式
Pool 属于枚举类型 D3DPOOL,用于指定顶点缓冲区内存类型,如下
D3DPOOL_DEFAULT 顶点缓冲区尽可能存在于显存中
D3DPOOL_MANAGED 由 Direct3D 系统自动调度顶点缓冲区内存类型(位于显存或计算机系统内存中)
D3DPOOL_SYSTEMMEM 顶点缓冲区位于计算机系统内存中
D3DPOOL_SCRATCH 顶点缓冲区位于计算机临时内存中,这种类型的顶点缓冲区不能直接用于渲染操作,只能进行内存加锁,复制等操作
ppVertexBuffer 指向创建的顶点缓冲区地址的指针,用于返回顶点缓冲区的地址
pHandle 一个保留参数,可设置为 NULL
***顶点缓冲区加锁***========================================
IDirect3DVertexBuffer9::Lock
HRESULT Lock(
UINT OffsetToLock,
UINT SizeToLock,
VOID **ppbData,
DWORD Flags
);
OffsetToLock 指定加锁的内存起始地址
SizeToLock 指定加锁内存大小
ppbData 用于返回内存指针地址
Flags 表示顶点缓冲区的加锁属性,它可以取 0 (默认值),或从如下中任意的逻辑或
D3DLOCK_DISCARD 更新整个缓冲区
D3DLOCK_NO_DIRTY_UPDATE 在默认状态下,对缓冲区加锁会对该区域设置一个 Dirty 标记.该属性将不对该区域设置 Dirty 标记,当对缓冲区有特殊需要时使用
D3DLOCK_NO_SYSLOCK 在加锁过程中系统可以进行其它操作
D3DLOCK_READONLY 设置缓冲区为只读属性
D3DLOCK_NOOVERWRITE 保证不覆盖缓冲区数据,设置该属性可以立即返回内存指针,提高系统性能
***将顶点缓冲区和渲染数据流链接***==========================
IDirect3DDevice9::SetStreamSource
HRESULT SetStreamSource(
UINT StreamNumber,
IDirect3DVertexBuffer9 *pStreamData,
UINT OffsetInBytes,
UINT Stride
);
StreamNumber 表示与顶点缓冲区链接的渲染数据流的序号,它是一个大于等于 0 的整数
pStreamData 表示与渲染数据流链接的顶点缓冲区地址
OffsetInBytes 表示渲染数据流中有效的顶点数据的起始地址,以字节数表示
Stride 表示浸染数据流中两个相邻顶点地址相差的字节数,通常它应等于顶点在内存中所占用的字节数
***绘制当前渲染数据流中的图元***============================
IDirect3DDevice9::DrawPrimitive
HRESULT DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex,
UINT PrimitiveCount
);
PrimitiveType 表示将要绘制的图元类型,参数为如下之一
Direct3D 基本图元类型
方法 绘图方式 图形数目
D3DPT_TRIANGLEFAN 扇形模式 n-2
D3DPT_TRIANGLESTRIP 共边三角形 n-2
D3DPT_TRIANGLELIST 独立三角形 n/3
D3DPT_LINELIS
T 每二个点表示一个线 n/2
D3DPT_LINESTRIP 折线 n-1
D3DPT_POINTLIST 独立的点 n
StartVertex 表示从顶点缓冲区的第几个顶点开始绘制图元
PrimitiveCount 表示将要绘制的图元数目
*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论