dx11学习笔记-1.创建一个空窗口

资料:
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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值