鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > .net技术 > vs2010 > >

《Beginning DirectX11 Game Programming》读书笔记2 一步一步开始第一个Direct

来源:互联网 作者:佚名 时间:2013-06-19 11:37
最好的学习方式就是动手操作。以下代码可以在书籍官方网站上下载。 以下基于Windows7+VS2010 开发环境。并确保您已经安装DXSDK。 开始编写第一个DirectX程序。 1、运行VS2010,新建项目 BlankWindow 2、添加Windows创建代码。此后,当前项目会作为后续练习项

最好的学习方式就是动手操作。以下代码可以在书籍官方网站上下载。

 

以下基于Windows7+VS2010 开发环境。并确保您已经安装DXSDK。

 

开始编写第一个DirectX程序。 1、运行VS2010,新建项目 BlankWindow

image

 

2、添加Windows创建代码。此后,当前项目会作为后续练习项目的模版

 

1、添加main.cpp源文件 2、编写win32 sdk代码,程序入口#include <Windows.h> int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE prevInstance, LPWSTR cmdLine,int cmdShow) { return 0; }

这里我们使用wWinMain代替WinMain,支持Unicode参数。对应参数3类型LPWSTR

 

3、初始化窗口、消息处理#include <Windows.h> LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE prevInstance, LPWSTR cmdLine,int cmdShow) { UNREFERENCED_PARAMETER(prevInstance); UNREFERENCED_PARAMETER(cmdLine); // 注册窗口 WNDCLASSEX wndClass={0}; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.style = CS_HREDRAW|CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.hInstance = hInstance; wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wndClass.lpszMenuName=NULL; wndClass.lpszClassName = "DX11GeoWindowClass"; if(!RegisterClassEx(&wndClass)){ return -1; } // 创建窗口 RECT rc = {0,0,640,480}; AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,FALSE); HWND hwnd = CreateWindowA("DX11GeoWindowClass","Blank Win32 Window", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,rc.right-rc.left,rc.bottom-rc.top,NULL,NULL,hInstance,NULL); if(!hwnd) return -1; // 显示 ShowWindow(hwnd,cmdShow); // 消息处理 MSG msg = {0}; while(msg.message!=WM_QUIT){ if(PeekMessage(&msg,0,0,0,PM_REMOVE)){ TranslateMessage(&msg); DispatchMessage(&msg); } } return 0; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message){ case WM_PAINT: break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; }

Win32 SDK窗口程序基本框架,可以参考MSDN。这里,UNREFERENCED_PARAMETER用于告诉编译器不使用的参数,避免编译器警告提示。

养成处理所有警告提示的良好的编程风格

 

运行效果,

image

 

 

3、新项目 BlankD3DWindow 新建项目到现有解决方案

image

 

进入项目属性,配置附加链接库。

d3d11.lib;d3dx11.lib;dxerr.lib 注意,半角逗号分隔

image

 

设置链接库引用路径

$(DXSDK_DIR)Include; $(DXSDK_DIR)Lib\x86;

image

 

初始化Direct3D

步骤,

  • 定义创建设备的驱动类型、特性水平、交换链
  • 创建设备类型
  • 创建渲染目标
  • 设置视图
  •  

    创建设备的驱动类型包含,

  • 硬件加速:性能最好,香港空间,也称为HAL(硬件抽象层)
  • WARP :DX11新加入。Windows高级光栅化平台,香港服务器,采用软件模拟方式。微软对指令进行了高度优化
  • 软件驱动 : 开发者编写自己的渲染驱动插件。不需要DXSDK支持。但不建议在有高性能要求的程序中使用
  • REFERENCE:软件模拟所有D3D特性,速度很慢。一般用于开发,需要DXSDK支持
  • NULL:本质上同REFERENCE,但没有渲染功能
  • 特性水平包含,

  • 11.0
  • 10.1
  • 10.0
  •  

    什么是交换链?

    用于交换前后缓冲(可以理解为前一帧、后一帧,使得连续输出),包含如下描述属性

  • 缓冲数量(可以多组)
  • 输出长宽
  • 缓冲格式
  • FPS。一般液晶显示器60HZ
  • 定义交换链描述。DXGI_SWAP_CHAIN_DESC swapChainDesc; ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) ); swapChainDesc.BufferCount = 1;//缓冲数量 swapChainDesc.BufferDesc.Width = width;//输出长宽 swapChainDesc.BufferDesc.Height = height; swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;//格式 swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;//FPS swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.OutputWindow = hwnd; swapChainDesc.Windowed = true;//是否窗口形式 false; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0;
    网友评论
    <