基于win32创建的direct3d程序

本文介绍了一个简单的DirectX应用程序实例,演示了如何使用DirectX 9进行基本的三维图形渲染,包括初始化DirectX环境、创建顶点缓存、设置渲染状态及绘制三角形等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源代码:
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#include <d3d9.h>
#include <windows.h>
LPDIRECT3D9 g_pD3D=NULL;//direct3d对象
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//direct3d设备对象
LPDIRECT3DVERTEXBUFFER9  g_pVertexBuffer=NULL;//点表
struct CUSTOMVERTEX 
{
	FLOAT X,Y,Z,rhw;
	DWORD colour;
};
#define  D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
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;
}
HRESULT InitialiseVertexBuffer()
{
	void *pVertices;
	CUSTOMVERTEX cvVertices[]=
	{
		{250.0f,100.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0),

		},
		{
			400.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0),
		},
		{
		100.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255),
		},
	};
	if(FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,
		D3DPOOL_DEFAULT,&g_pVertexBuffer,NULL)))
		return E_FAIL;
	if(FAILED(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(void**)&pVertices,0)))
		return E_FAIL;
		memcpy(pVertices,cvVertices,sizeof(cvVertices));
	g_pVertexBuffer->Unlock();
	return S_OK;
}

void Render()
{
	if(g_pd3dDevice==NULL)
		return;
	g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
	//开始在后台缓冲区绘制图行
	if (SUCCEEDED(g_pd3dDevice->BeginScene()))
	{
		//在此在后台缓冲区绘制图形
		g_pd3dDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
		g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);//设置点的样式
		g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
		//结束在后台缓冲区的渲染图形
		g_pd3dDevice->EndScene();
	}
	//将在后台缓冲区绘制的图形提交到前台缓冲区显示
	g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
void CleanUp()
{
	if (g_pVertexBuffer!=NULL)
	{
		g_pVertexBuffer->Release();
		g_pVertexBuffer=NULL;
	}
	if (g_pd3dDevice!=NULL)
	{
		g_pd3dDevice->Release();
		g_pd3dDevice=NULL;

	}
	if (g_pD3D!=NULL)
	{
		g_pD3D->Release();
		g_pD3D=NULL;
	}
}
LRESULT WINAPI WinProc(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);
}

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR ,INT)
{
	WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
		GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"ClassName",NULL};
	RegisterClassEx(&wc);
	//创建窗口
	HWND hWnd=CreateWindow("ClassName","第一个Directx程序",WS_OVERLAPPEDWINDOW,200,100,600,500,
		NULL,NULL,wc.hInstance,NULL);
	//初始化
	if (SUCCEEDED(InitD3D(hWnd)))
	{
		ShowWindow(hWnd,SW_SHOWDEFAULT);
		UpdateWindow(hWnd);
		if (SUCCEEDED(InitialiseVertexBuffer()))
		{
			MSG msg;
			ZeroMemory(&msg,sizeof(msg));
			while (msg.message!=WM_QUIT)
			{
				if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
				{
					TranslateMessage(&msg);
					DispatchMessage(&msg);
				}
				else
					Render();//渲染图形
				

			}
		}
	}
	UnregisterClass("ClassName",wc.hInstance);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值