D3D Mesh 例子程序

D3D Mesh 例子程序

程序目的

加载简单的 .x资源文件 ,显示mesh 模型。

程序实现

#pragma once

#pragma comment(lib,"winmm.lib")

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

#include<d3d9.h>
#include<d3dx9.h>

LRESULT CALLBACK MsgProc(
	HWND hWnd,
	UINT msg,
	WPARAM wParam,
	LPARAM lParam);

HRESULT Init(HWND hWnd);
HRESULT InitD3D(HWND hWnd);
void InitMatrices();
HRESULT InitGeometry();
void SetUpMatrices();
void Render();
void CleanUp();

LPDIRECT3D9 g_pd3d9=NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice9=NULL;
D3DXMATRIXA16 worldMatrix;
D3DXMATRIXA16 viewMatrix;
D3DXMATRIXA16 projectionMatrix;
LPD3DXMESH g_pd3dMesh=NULL;
D3DMATERIAL9* g_pd3dMeshMaterial=NULL;
LPDIRECT3DTEXTURE9* g_pd3dMeshTexture=NULL;
DWORD g_dwNumMaterials=0;

INT WINAPI wWinMain(
	HINSTANCE,
	HINSTANCE,
	LPWSTR,
	INT)
{
	WNDCLASSEX wcex;
	ZeroMemory(&wcex,sizeof(wcex));
	wcex.cbSize=sizeof(wcex);
	wcex.hInstance=GetModuleHandle(NULL);
	wcex.lpfnWndProc=MsgProc;
	wcex.lpszClassName=L"DXMeshes";
	wcex.style=CS_CLASSDC;

	RegisterClassEx(&wcex);

	HWND hWnd=CreateWindowEx(
		WS_EX_OVERLAPPEDWINDOW,
		L"DXMeshes",
		L"DXMeshes Window",
		WS_OVERLAPPEDWINDOW,
		100,
		100,
		300,
		300,
		NULL,
		NULL,
		wcex.hInstance,
		NULL);

	ShowWindow(hWnd,SW_SHOWDEFAULT);
	UpdateWindow(hWnd);

	if(FAILED(Init(hWnd)))
	{
		return -1;
	}

	MSG msg;
	ZeroMemory(&msg,sizeof(msg));
	while(msg.message != WM_QUIT)
	{
		if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			Render();
		}
	}

	UnregisterClass(L"DXMeshes",wcex.hInstance);

	return 0;
}

LRESULT CALLBACK MsgProc(
	HWND hWnd,
	UINT msg,
	WPARAM wParam,
	LPARAM lParam)
{
	switch(msg)
	{
	case WM_DESTROY:
		CleanUp();
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hWnd,msg,wParam,lParam);
}

HRESULT Init(HWND hWnd)
{
	if(FAILED(InitD3D(hWnd)))
	{
		return E_FAIL;
	}

	InitMatrices();

	if(FAILED(InitGeometry()))
	{
		return E_FAIL;
	}

	return S_OK;
}

HRESULT InitD3D(HWND hWnd)
{
	g_pd3d9=Direct3DCreate9(D3D_SDK_VERSION);
	if(g_pd3d9 == NULL)
	{
		return E_FAIL;
	}

	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.Windowed=TRUE;
	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
	d3dpp.EnableAutoDepthStencil=TRUE;
	d3dpp.AutoDepthStencilFormat=D3DFMT_D16;

	if(FAILED(g_pd3d9->CreateDevice(
		D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL,
		hWnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&d3dpp,
		&g_pd3dDevice9)))
	{
		return E_FAIL;
	}

	return S_OK;
}

void Render()
{
	g_pd3dDevice9->Clear(
		0,
		NULL,
		D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
		D3DCOLOR_XRGB(0,0,255),
		1.0f,
		0);

	if(SUCCEEDED(g_pd3dDevice9->BeginScene()))
	{
		SetUpMatrices();

		for(DWORD i=0;i<g_dwNumMaterials;i++)
		{
			g_pd3dDevice9->SetMaterial(&g_pd3dMeshMaterial[i]);
			g_pd3dDevice9->SetTexture(0,g_pd3dMeshTexture[i]);
			g_pd3dMesh->DrawSubset(i);
		}

		g_pd3dDevice9->EndScene();
	}

	g_pd3dDevice9->Present(NULL,NULL,NULL,NULL);
}

void CleanUp()
{
	if(g_pd3dMeshMaterial != NULL)
	{
		delete[] g_pd3dMeshMaterial;
		g_pd3dMeshMaterial=NULL;
	}

	if(g_pd3dMeshTexture != NULL)
	{
		for(DWORD i=0;i<g_dwNumMaterials;i++)
		{
			if(g_pd3dMeshTexture[i] != NULL)
			{
				g_pd3dMeshTexture[i]->Release();
				g_pd3dMeshTexture[i]=NULL;
			}
		}

		delete[] g_pd3dMeshTexture;
		g_pd3dMeshTexture=NULL;
	}

	if(g_pd3dMesh != NULL)
	{
		g_pd3dMesh->Release();
		g_pd3dMesh=NULL;
	}

	if(g_pd3dDevice9 != NULL)
	{
		g_pd3dDevice9->Release();
		g_pd3dDevice9=NULL;
	}

	if(g_pd3d9 != NULL)
	{
		g_pd3d9->Release();
		g_pd3d9=NULL;
	}
}

void InitMatrices()
{
	//world matrix.
	D3DXMatrixIdentity(&worldMatrix);
	g_pd3dDevice9->SetTransform(D3DTS_WORLD,&worldMatrix);

	//view matrix.
	D3DXVECTOR3 vEye(0.0f,3.0f,-5.0f);
	D3DXVECTOR3 vLookAt(0.0f,0.0f,0.0f);
	D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
	D3DXMatrixLookAtLH(&viewMatrix,&vEye,&vLookAt,&vUp);
	g_pd3dDevice9->SetTransform(D3DTS_VIEW,&viewMatrix);

	//projection matrix.
	D3DXMatrixPerspectiveFovLH(&projectionMatrix,D3DX_PI/4,1.0f,1.0f,1000.0f);
	g_pd3dDevice9->SetTransform(D3DTS_PROJECTION,&projectionMatrix);
}

void SetUpMatrices()
{
	D3DXMatrixRotationY(&worldMatrix,timeGetTime()/1000.0f);
	g_pd3dDevice9->SetTransform(D3DTS_WORLD,&worldMatrix);
}

HRESULT InitGeometry()
{
	LPD3DXBUFFER pd3dxMtrlBuffer;
	if(FAILED(D3DXLoadMeshFromX(
		L"Tiger.x",
		D3DXMESH_SYSTEMMEM,
		g_pd3dDevice9,
		NULL,
		&pd3dxMtrlBuffer,
		NULL,
		&g_dwNumMaterials,
		&g_pd3dMesh)))
	{
		return E_FAIL;
	}

	D3DXMATERIAL* d3dxMaterials=(D3DXMATERIAL*)pd3dxMtrlBuffer->GetBufferPointer();
	g_pd3dMeshMaterial=new D3DMATERIAL9[g_dwNumMaterials];
	if(g_pd3dMeshMaterial == NULL)
	{
		return E_OUTOFMEMORY;
	}

	g_pd3dMeshTexture=new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
	if(g_pd3dMeshTexture == NULL)
	{
		return E_OUTOFMEMORY;
	}

	for(DWORD i=0;i<g_dwNumMaterials;i++)
	{
		g_pd3dMeshMaterial[i]=d3dxMaterials[i].MatD3D;
		g_pd3dMeshMaterial[i].Ambient=g_pd3dMeshMaterial[i].Diffuse;

		if(d3dxMaterials[i].pTextureFilename != NULL&& 
			lstrlenA(d3dxMaterials[i].pTextureFilename) > 0)
		{
			if(FAILED(D3DXCreateTextureFromFileA(
				g_pd3dDevice9,
				d3dxMaterials[i].pTextureFilename,
				&g_pd3dMeshTexture[i])))
			{
				return E_FAIL;
			}
		}
	}

	pd3dxMtrlBuffer->Release();

	g_pd3dDevice9->SetRenderState(D3DRS_ZENABLE,TRUE);

	g_pd3dDevice9->SetRenderState(D3DRS_AMBIENT,0xffffffff);

	return S_OK;
}

运行结果

总结

1.这个倒不是很难,加载上.x文件以后,从加载的对象里面获取各种数据,最后在渲染得时候依次显示就可以了。

2.练习多了就会越来越熟练。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
D3D渲染是指使用Direct3D图形编程接口进行图形渲染的过程。NV12是一种图像颜色格式,其中Y代表亮度信息,U和V代表色度信息。下面是使用D3D渲染NV12图像的步骤简述: 1. 创建D3D设备:首先需要创建一个D3D设备来进行图形渲染。通过调用D3D的相关函数,可以创建一个设备对象,并且配置设备的显示参数,如分辨率、帧率等。 2. 创建纹理和顶点缓冲:在D3D渲染中,需要创建对应NV12格式的纹理和顶点缓冲,用于存储图像数据和顶点数据。可以使用D3D提供的函数来创建纹理和顶点缓冲,并设置其格式和大小。 3. 加载NV12图像数据:将NV12格式的图像数据加载到纹理中。可以使用D3D提供的相关函数,将NV12图像数据转换成适用于D3D渲染的格式,并将数据加载到纹理中。 4. 自定义着色器:为了正确渲染NV12图像,需要自定义着色器来对纹理中的像素进行处理。可以使用HLSL语言编写着色器代码,并通过D3D进行编译和加载。 5. 绘制图像:通过调用D3D的绘制函数,将纹理中的数据渲染到屏幕上。可以使用顶点缓冲和着色器来指定绘制的位置和样式。 6. 清理资源:在图像渲染完成后,需要释放D3D设备、纹理、顶点缓冲等相关资源,以释放内存和避免资源泄露。 总结而言,使用D3D渲染NV12图像的过程包括创建D3D设备、加载图像数据、自定义着色器、绘制图像和清理资源等步骤。通过合理配置D3D设备和使用适当的着色器代码,可以实现对NV12图像的渲染展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当当小螳螂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值