资料:
Microsoft DirectX SDK (June 2010) source code&document
《DX11游戏编程入门》source code&pdf
基本流程
1、初始化dx环境:
最基本的三个变量
ID3D11Device* g_pd3dDevice = NULL;
ID3D11DeviceContext* g_pImmediateContext = NULL;
IDXGISwapChain* g_pSwapChain = NULL;
In Direct3D 10, the device object was used to perform both rendering and resource creation. In Direct3D 11, the immediate context is used by the application to perform rendering onto a buffer, and the device contains methods to create resources.
也就是说,device负责创建各种资源,context负责渲染。而swapchain管理着渲染的“画布”——缓存。
更进一步解释,device负责着dx和硬件之间的通信,context负责告诉device渲染是怎么个设置,保存着渲染的状态信息,而swapchain可以看做渲染的目标。
缓存:就是存放数据的一块空间,一块具有固定尺寸的内存。比如光栅屏幕缓存其实是个二维数组,每个像素的信息就是缓存中一个元素。所谓渲染到缓存上,其实是用计算得到的颜色值去填充每一个像素。
其他必需变量
ID3D11RenderTargetView* g_pRenderTargetView = NULL;
DX中我们通过调用swapChain的GetBuffer方法来得到其管理的缓存地址,得到缓存地址后,作为参数传入device调用的CreateRenderTargetView方法,创建并保存到g_pRenderTargetView 。我们通过变量获取的缓存指针此时便没有用处了,需要及时调用Release方法将其占用资源释放,否则会发生内存泄露。
此处《DX11游戏编程》的解释为:当我们获得一个COM对象的引用时,该对象的引用数+1,确定该对象不会被再次调用时,需要调用COM对象的Release函数将该对象的引用数-1。当COM对象的引用数为0时,就会被删除。
相关知识可查阅“缓存池”
现在我们有了渲染目标g_pRenderTargetView ,那就需要告诉context这目标是谁。调用context的OMSetRenderTargets方法,传入g_pRenderTargetView 即可关联二者。
接下来,继续为context设置渲染的各个属性。
渲染在什么区域?调用context的RSSetViewports方法。此处viewport设置了渲染视口的长宽、渲染的左上角对应在窗口内屏幕的XY坐标,和需要渲染的最大最小深度。如果XY坐标都设为0,那么渲染视口左上角就与客户区窗口左上角重合。
2、渲染:
context调用ClearRenderTargetView方法来设置用于更新缓存的基本颜色;
swapChain调用Present来重绘。
3、清理:
按照从子对象到父对象的顺序,调用COM对象的Release方法,将其释放。
注意释放前需要检查指针是否存在,如果对不存在的对象指针调用其方法,会产生不可预料的后果。
完整代码
见Microsoft DirectX SDK (June 2010) Tutorial01
//--------------------------------------------------------------------------------------
// File: Tutorial01.cpp
//
// This application demonstrates creating a Direct3D 11 device
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#include <windows.h>
#include <d3d11.h>
#include <d3dx11.h>
#include "resource.h"
//--------------------------------------------------------------------------------------
// Global Variables
//--------------------------------------------------------------------------------------
HINSTANCE g_hInst = NULL;
HWND g_hWnd = NULL