DXUT 初步学习 框架初识

初识DXUT

什么是DXUT

这个概念性的东西,不同的人不同的理解,总的来说还是比较简单的D3D小框架,对D3D的一个简单的封装,可以理解成一个类库。微软作用,可以更好的展示D3D的功能和新发布的特性;游戏开发者作用,可以更快更轻巧的展示模型结果,检验算法效果;学习者作用,可以是一个入门的精巧例子,由于D3D的例子大部分都是利用DXUT的,所以可以更快的学习D3D SDK中的例子,加速学习过程。

现在的DXUT

现在的DXUT主要有D3D9 D3D10和D3D11三个版本,可以看出来D3DX的版本是跟着SDK的,到了D3D11 的DXUT就是一个额外的部分的,不随着SDK一起发布了,这个是后话,现在一般还是有的。这篇入门级别的文章还是D3D9的。

架构浅解

dxut库

打开sdk 里面的例子可以看到DXUT,进入dxut那么就会看见两个目录,core 和optional。意思是很明白的,一个是dxut的核心部分,一个是dxut的可选部分,我们的文章现在只是关注核心的这一部分。打开core里面的工程,如果没有什么配置问题,直接编译就会生成dxut的静态库。dxut.lib这个就是牛气轰轰的dxut核心库了。我们可以在项目中加入头文件和生成的库来构建程序,也就是使用了dxut。我没有发现dxut封装到dll中的可能,因为里面的函数没有导入和导出关键字,也就是说,现在的dxut仅支持静态链接。可选库也可以这样子获得,不过这篇文章没有这样做。

dxut代码

我们也可以不用库,直接在项目中加入dxut的源代码,代价就是编译时间长一些罢了,但是,不符合库的思想而已。

dxut运行过程

dxut先配置一些回调函数,然后就是主函数的实际操作进入消息循环。就这么简单,客户要使用这些功能就是在各种回调函数里面编写代码。说的挺简单的,但是要想真的学习dxut这个类库,还是需要熟练记住一些函数的,是的,我们编程不要求死记硬背,但是你花费半个小时去背一些主要函数你就会发现自己对库的理解不仅仅一丁半点了。理解这段话需要有一定的win32和d3d基础。

应用练习

配置目录

配置d3d和dxut的头文件目录。d3d头文件目录在sdk中,dxut的头文件目录是自己创建的,将core下的头文件添加上就可以了。配置库目录,d3d库目录还是在sdk中,dxut的库目录还是自己创建的,将生成的dxut.lib加入就可以了。至于如何配置这些目录就是项目属性里面找了。

程序代码

#pragma once

//win32
#pragma comment(lib,"comctl32.lib")

//d3d
#pragma comment(lib,"dxerr.lib")
#pragma comment(lib,"d3dx9.lib")

//dxut
#pragma comment(lib,"dxut.lib")

//dxut
#include"DXUT.h"

HRESULT CALLBACK OnDeviceCreate(
	IDirect3DDevice9* pd3dDevice,
	const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
	void* pUserContext );

void    CALLBACK OnDeviceDestroyed(
	void* pUserContext );

void    CALLBACK OnFrameRender(
	IDirect3DDevice9* pd3dDevice,
	double fTime,
	float fElapsedTime,
	void* pUserContext );

void SetUpMatrix(
	IDirect3DDevice9* pd3dDevice);

void SetupLight(
	IDirect3DDevice9* pd3dDevice);

//TODO: global variables.
ID3DXMesh* g_pd3dMesh=NULL;

INT WINAPI wWinMain(
	HINSTANCE,
	HINSTANCE,
	LPWSTR,
	INT)
{
	DXUTSetCallbackD3D9DeviceCreated(
		OnDeviceCreate,
		NULL);

	DXUTSetCallbackD3D9DeviceDestroyed(
		OnDeviceDestroyed,
		NULL);

	DXUTSetCallbackD3D9FrameRender(
		OnFrameRender,
		NULL);

	//0.dxut init.
	DXUTInit(
		true,
		true,
		NULL,
		true);

	//1.create window
	DXUTCreateWindow(
		L"dxut window",
		GetModuleHandle(NULL),
		NULL,
		NULL,
		CW_USEDEFAULT,
		CW_USEDEFAULT);

	//2.create device.
	DXUTCreateDevice(
		true,
		640,
		480);

	//3.main loop
	DXUTMainLoop();

	//exit.
	return DXUTGetExitCode();
}

HRESULT CALLBACK OnDeviceCreate(
	IDirect3DDevice9* pd3dDevice,
	const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
	void* pUserContext )
{
	//TODO: create d3d device.
	D3DXCreateTeapot(pd3dDevice,&g_pd3dMesh,NULL);

	return S_OK;
}

void    CALLBACK OnDeviceDestroyed(
	void* pUserContext )
{
	//TODO:destroy d3d device.
	if(g_pd3dMesh!=NULL)
	{
		g_pd3dMesh->Release();
		g_pd3dMesh=NULL;
	}
}

void    CALLBACK OnFrameRender(
	IDirect3DDevice9* pd3dDevice,
	double fTime,
	float fElapsedTime,
	void* pUserContext )
{
	pd3dDevice->Clear(
		0,
		NULL,
		D3DCLEAR_TARGET,
		D3DCOLOR_XRGB(0,0,255),
		1.0f,
		0);

	SetUpMatrix(pd3dDevice);

	SetupLight(pd3dDevice);

	if(SUCCEEDED(pd3dDevice->BeginScene()))
	{
		//TODO:render d3d scene.
		g_pd3dMesh->DrawSubset(0);

		pd3dDevice->EndScene();
	}

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

void SetUpMatrix(
	IDirect3DDevice9* pd3dDevice)
{
	D3DXMATRIXA16 viewMatrix;
	D3DXVECTOR3 vEye(0.0f,5.0f,-3.0f);
	D3DXVECTOR3 vLookAt(0.0f,0.0f,0.0f);
	D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
	D3DXMatrixLookAtLH(&viewMatrix,&vEye,&vLookAt,&vUp);
	pd3dDevice->SetTransform(D3DTS_VIEW,&viewMatrix);

	D3DXMATRIXA16 projectionMatrix;
	D3DXMatrixPerspectiveFovLH(&projectionMatrix,D3DX_PI/4,1.0f,1.0f,1000.0f);
	pd3dDevice->SetTransform(D3DTS_PROJECTION,&projectionMatrix);
}

void SetupLight(
	IDirect3DDevice9* pd3dDevice)
{
	D3DMATERIAL9 mtrl;
	ZeroMemory(&mtrl,sizeof(mtrl));
	mtrl.Ambient.r=mtrl.Diffuse.r=1.0f;
	mtrl.Ambient.g=mtrl.Diffuse.g=1.0f;
	mtrl.Ambient.b=mtrl.Diffuse.b=0.0f;
	mtrl.Ambient.a=mtrl.Diffuse.a=1.0f;
	pd3dDevice->SetMaterial(&mtrl);

	D3DLIGHT9 light;
	D3DXVECTOR3 dir(1.0f,0.0f,0.0f);
	D3DXCOLOR color(1.0f,1.0f,1.0f,0.0f);
	ZeroMemory(&light,sizeof(light));
	light.Type=D3DLIGHT_DIRECTIONAL;
	light.Ambient=color*0.6f;
	light.Diffuse=color;
	light.Specular=color*0.6f;
	light.Direction=dir;
	pd3dDevice->SetLight(0,&light);
	pd3dDevice->LightEnable(0,TRUE);

	pd3dDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
	pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
}

总结

运行结果

综合

我也是新手,研究中。我觉得理解了库的思想很有帮助,图形方面的算法还没有涉及,不过会学的。对dxut的学习需要研究一段时间,将来检验模型的时候可以很快地得到结果,而且也是认识新的版本的d3d的有力帮手,你说不是么?

DXUT 初步学习 框架初识

时间: 2024-11-05 12:35:53

DXUT 初步学习 框架初识的相关文章

LinQ的初步学习与总结

嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单啦,下面就全面的总结一下LinQ的其中一部分,LinQ有三部分:LinQ TO Object:LinQ TO SQL ;LinQ TO XML.而在这里我先来总结一下LinQ TO Object的学习吧 一.初步认识LinQ to Object static void Main(string[] a

Java深度历险(三) Maven初步学习

这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 在gxpt中的体现 1. 父子关系 一个多模块项目通过一个父POM 引用一个或多个子模块来定义. a. 在父目录中分别创建子项目 b. 父项目,通过以下配置,将子项目关联: 如下: <span style="font-size:18px;"

StyleCop学习笔记——初识StyleCop

一.定义 StyleCop是微软的一个开源的静态代码分析工具,检查c#代码一致性和编码风格. 二.支持的环境. JetBrains R# 5.1.3 ( 5.1.3000.12) JetBrains R# 6.0 (6.0.2202.688) JetBrains R# 6.1 (6.1.37.86) JetBrains R# 6.1.1 (6.1.1000.82) JetBrains R# 7.0.1 (7.0.1098.2760) JetBrains R# 7.1.3 (7.1.3000.22

TensorFlow【机器学习】:如何正确的掌握Google深度学习框架TensorFlow(第二代分布式机器学习系统)?

本文标签:   机器学习 TensorFlow Google深度学习框架 分布式机器学习 唐源 VGG REST   服务器 自 2015 年底开源到如今更快.更灵活.更方便的 1.0 版本正式发布,由 Google 推出的第二代分布式机器学习系统 TensorFlow一直在为我们带来惊喜,一方面是技术层面持续的迭代演进,从分布式版本.服务框架 TensorFlow Serving.上层封装 TF.Learn 到 Windows 支持.JIT 编译器 XLA.动态计算图框架 Fold 等,以及

基于OpenGL ES 的深度学习框架编写

基于OpenGL ES的深度学习框架编写 背景与工程定位 背景 项目组基于深度学习实现了视频风格化和人像抠图的功能,但这是在PC/服务端上跑的,现在需要移植到移动端,因此需要一个移动端的深度学习的计算框架. 同类型的库 caffe-android-lib 目前应该是最便于集成使用的深度学习框架库. tensorflow和mxnet据说也有对应的android库,因时间原因暂未测试. CNNdroid,网址https://zhuanlan.zhihu.com/p/25259452,这个是用 ren

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

一线开发者在Reddit上讨论深度学习框架:PyTorch和TensorFlow到底哪个更好?

本文标签:   机器学习 TensorFlow Google深度学习框架 分布式机器学习 PyTorch   近日,Reddit用户 cjmcmurtrie 发了一个主题为「PyTorch vs. TensorFlow」的讨论帖,想要了解这两大流行的框架之间各自有什么优势. 原帖地址:https://redd.it/5w3q74 帖子一楼写道: 我还没有从 Torch7 迁移到 TensorFlow.我玩过 TensorFlow,但我发现 Torch7 更加直观(也许是我玩得不够?).我也尝试了

Jquery Easy UI初步学习(二)datagrid的使用

第一篇学的是做一个管理的外框,接着就是数据datagrid绑定了,这里我用asp.net mvc3来做的,主要就是熟悉属性.方法. 打开easyui的demo 就可以看到如下一段代码: 和上篇一样class="easyui-datagrid", data-options="...",这是一样的,其他我在网上查了查,并做了整理 DataGrid 属性 参数名 类型 描述 默认值 title string Datagrid面板的标题 null iconCls strin

PAC学习框架

PAC学习框架 转自:http://www.cnblogs.com/alphablox/p/5935826.html PAC学习框架是机器学习的基础.它主要用来回答以下几个问题: 什么问题是可以高效学习的? 什么问题本质上就难以学习? 需要多少实例才能完成学习? 是否存在一个通用的学习模型? PAC=probably approximately correct,很可能接近正确的 --------------------- 什么问题能得到"可能接近正确"的结果呢?原文说的比较抽象,我把他