首先,我已经有一定的D3D11的基础,《Introduction to 3D Game Programming with Direct3D 11》,我已经具备D3D11入门水平了,我决定用D3D11龙书和http://www.rastertek.com/tutindex.html 给的教程一路做下来,主要学习方式打算是这样:看D3D11龙书,但实现是在http://www.rastertek.com/tutindex.html的教程下,这样两个相结合吧.

一,学习本教程前你得具备的知识.

(1)入门级别的C++基础

(2)最好拥有win32的基础,了解win32窗口的创建和消息的运行机制。

二,本节教程的程序框架如下:

这是程序的截图

三,本节教程的具体程序如下:

(1)负责图形渲染的类

GraphicsClass.h

#pragma once
#ifndef _GRAPHICS_CLASS_H
#define _GRAPHICS_CLASS_H#include<Windows.h>//全局变量
const bool FULL_SCREEN = false;
const bool VSYNC_ENABLE = true;
const float SCREEN_DEPTH = 1000.0f;  //视截体远裁面
const float SCREEN_NEAR = 0.1f;  //视截体近裁面class GraphicsClass
{private:bool Render();public:GraphicsClass();GraphicsClass(const GraphicsClass&);~GraphicsClass();public:bool Initialize(int ScreenWidth, int ScreenHeight, HWND hwnd);void Shutdown();bool Frame();
};
#endif // !_GRAPHICS_CLASS_H

GraphicsClass.cpp

#include"GraphicsClass.h"GraphicsClass::GraphicsClass()
{}GraphicsClass::~GraphicsClass()
{}GraphicsClass::GraphicsClass(const GraphicsClass&other)
{}bool GraphicsClass::Initialize(int ScreenWidth, int ScreenHeight, HWND hwnd)
{return true;
}void GraphicsClass::Shutdown()
{}bool GraphicsClass::Frame()
{return true;
}bool GraphicsClass::Render()
{return true;
}

(2)负责输入输出的类

InputClass.h

#pragma once
#ifndef _INPUT_CLASS_H
#define _INPUT_CLASS_H
class InputClass
{
private://对应的键是否被按下bool mKey[256];  public:InputClass();InputClass(const InputClass&);~InputClass();public:void Initialize();void KeyDown(unsigned int wParam);void KeyUp(unsigned int wParam);bool IsKeyDown(unsigned int wParam);};
#endif

InputClass.CPP

#include"InputClass.h"InputClass::InputClass()
{}InputClass::InputClass(const InputClass& inputclass)
{}InputClass::~InputClass()
{}void InputClass::Initialize()
{for (int i = 0; i < 256; ++i){mKey[i] = false;}
}void InputClass::KeyDown(unsigned int input)
{mKey[input] = true;
}void InputClass::KeyUp(unsigned int input)
{mKey[input] = false;
}bool InputClass::IsKeyDown(unsigned int key)
{return mKey[key];
}

(3)控制整个渲染系统的类

SystemClass.h

#pragma once
#ifndef _SYSTEM_CLASS_H
#define _SYSTEM_CLASS_H
#define WIN32_LEAN_AND_MEAN  //这个宏可以减少Win32头文件的大小#include"InputClass.h"
#include<Windows.h>
#include"GraphicsClass.h"class SystemClass
{private:LPCWSTR mApplicationName;  //应用名字HINSTANCE mHinstance; //应用实例句柄HWND mHwnd; //应用窗口句柄private:InputClass* m_Input; //输入类GraphicsClass* m_Graphics; //图形类private://帧函数bool Frame();//初始化窗口函数void InitializeWindow(int&, int&);//关闭窗口函数void ShutdownWindow();public:/*构造函数*/SystemClass();/*拷贝构造函数*/SystemClass(const SystemClass&);/*析构函数*/~SystemClass();/*初始化函数*/bool Initialize();/*关闭应用函数*/void Shutdown();/*运行函数*/void Run();/*消息操作函数,这里这个函数接受的消息很多传递给全局静态函数WndProc处理,这个回调函数有些特殊,请注意*/LRESULT CALLBACK MessageHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
};#endif

SystemClass.cpp

#include"SystemClass.h"//全局变量
static SystemClass* D3DAPP = NULL;//接受SystemClass类对象的全局回调函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_DESTROY:{PostQuitMessage(0);  //发送WM_QUIT消息到消息队列 接收到WM_QUIT跳出消息循环return 0;}case WM_CLOSE:{PostQuitMessage(0);return 0;}//将其它消息传送到D3DAPP的MessageHandler函数default:return D3DAPP->MessageHandler(hwnd, message, wParam, lParam);}
}SystemClass::SystemClass()
{m_Graphics = NULL;m_Input = NULL;
}SystemClass::SystemClass(const SystemClass& sys)
{}/*不在析构函数中回收内存的一点原因是谨慎对待内存的回收问题*/
SystemClass::~SystemClass()
{}/*系统类初始化函数*/
bool SystemClass::Initialize()
{int ScreenWidth, ScreenHeight;bool result;/*初始化屏幕宽度和高度*/ScreenWidth = 0;ScreenHeight = 0;/*初始化系统类的窗口*/InitializeWindow(ScreenWidth, ScreenHeight);/*创建输入类对象*/m_Input = new InputClass();if (!m_Input){return false;}/*初始化输入对象*/m_Input->Initialize();/*创建图形类对象*/m_Graphics = new GraphicsClass();if (!m_Graphics){return false;}/*初始化图形对象,发生在窗口初始化之后,因为窗口初始化之后,窗口句柄才被建立*/result=m_Graphics->Initialize(ScreenWidth, ScreenHeight, mHwnd);if (!result){return false;}return true;
}void SystemClass::Shutdown()
{/*释放图形类对象*/if (m_Graphics){m_Graphics->Shutdown();delete m_Graphics;m_Graphics = NULL;}/*释放输入类对象*/if (m_Input){delete m_Input;m_Input = NULL;}/*关闭窗口*/this->ShutdownWindow();
}void SystemClass::Run()
{MSG msg = { 0 };bool done, result;/*循环直到收到来自窗口的或者使用者的quit消息*/done = false;while (!done){//操作窗口消息if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){if (msg.message == WM_QUIT){done = true;}  TranslateMessage(&msg);DispatchMessage(&msg);       //把消息发送到WindProc()中}else{result = Frame();  //Frame运行的函数可能造成游戏退出if (!result){done = true;}}}
}bool SystemClass::Frame()
{bool result;//你按下了退出函数,则退出这个应用(按键的宏刚好相对应)if (m_Input->IsKeyDown(VK_ESCAPE)){return false;}//进行图形对象的帧函数result = m_Graphics->Frame();if (!result){return false;}return true;
}LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){//确认一个键已经在键盘上按下case WM_KEYDOWN:{//如果一个键被按下,则将这个键的信息送到input object,为了可以记录这个状态m_Input->KeyDown((unsigned int)wParam);return 0;}//确认一个键被释放case WM_KEYUP:{//如果一个键被释放,则将这个键的信息送到input object,为了可以取消这个状态m_Input->KeyUp((unsigned int)wParam);return 0;}//其它的消息被送到默认处理消息函数default:{return DefWindowProc(hwnd, message, wParam, lParam); //为全局静态函数}}
}void SystemClass::InitializeWindow(int& ScrrenWidth, int &ScrrenHeight)
{WNDCLASSEX wc;DEVMODE dmScrrenSettings;int posX, posY;//获取一个额外的指向这个对象的指针D3DAPP = this;   //获取应用实例句柄mHinstance = GetModuleHandle(NULL);//给予应用一个名字mApplicationName = L"Engine";//设定要创建的类的属性 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;wc.lpfnWndProc = WndProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = mHinstance;wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);wc.hIconSm = wc.hIcon;wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);wc.lpszMenuName = NULL;wc.lpszClassName = mApplicationName;wc.cbSize = sizeof(WNDCLASSEX);//注册这个类RegisterClassEx(&wc);//获取屏幕分辨率的宽度和高度ScrrenWidth = GetSystemMetrics(SM_CXSCREEN);ScrrenHeight= GetSystemMetrics(SM_CYSCREEN);//取决于是否为全屏幕if (FULL_SCREEN){//如果为全屏幕,则设定屏幕为用户桌面的最大化并且为32bitmemset(&dmScrrenSettings, 0, sizeof(dmScrrenSettings));dmScrrenSettings.dmSize = sizeof(dmScrrenSettings);dmScrrenSettings.dmPelsWidth = (unsigned long)ScrrenWidth;dmScrrenSettings.dmPelsHeight = (unsigned long)ScrrenHeight;dmScrrenSettings.dmBitsPerPel = 32;dmScrrenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;//改变显示设定,设置为全屏幕ChangeDisplaySettings(&dmScrrenSettings, CDS_FULLSCREEN);//设定窗口左上角的位置posX = posY = 0;}else{//如果窗口化,设定为800*600分辨率ScrrenWidth = 800;ScrrenHeight = 600;//窗口位于屏幕稍微的左上方posX = (GetSystemMetrics(SM_CXSCREEN) - ScrrenWidth) / 2-200;posY = (GetSystemMetrics(SM_CYSCREEN) - ScrrenHeight) / 2-100;}//创建窗口,并且获取窗口的句柄mHwnd = CreateWindowEx(WS_EX_APPWINDOW, mApplicationName, mApplicationName,WS_OVERLAPPEDWINDOW,posX, posY, ScrrenWidth, ScrrenHeight, NULL, NULL, mHinstance, NULL);//将窗口显示于屏幕之上,并设定该窗口为主要集中点ShowWindow(mHwnd, SW_SHOW);SetForegroundWindow(mHwnd);SetFocus(mHwnd);//隐藏鼠标光标//ShowCursor(false);
}void SystemClass::ShutdownWindow()
{//显示鼠标光标//ShowCursor(true);//如果离开全屏幕模式,恢复显示设定if (FULL_SCREEN){ChangeDisplaySettings(NULL, 0);}//移除(破坏)窗口DestroyWindow(mHwnd);mHwnd = NULL;//移除程序实例UnregisterClass(mApplicationName, mHinstance);mHinstance = NULL;//置空应用类对象D3DAPP = NULL;}

(4)入口函数

main.cpp

#include"SystemClass.h"int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{SystemClass* System=NULL;bool result;//创建SystemClass类System = new SystemClass;if (!System){return 0;}//初始化和运行系统对象result = System->Initialize();if (result){System->Run();}//关闭systemclass对象System->Shutdown();delete System;System = NULL;return 0;
}

四,本节教程得注意的问题如下:

(1) 这个框架值得注意的一点是:   窗口的回调函数不是类内的,而是全局的消息回调函数LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam),在类内定义一个LRESULT CALLBACK MessageHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)接受来自全局函数回调WndProc函数的消息,避免了类内定义回调函数直接作为创建窗口的回调函数会出现的问题,这是封装win32回调函数经常会出现的问题。

五,程序运行结果如下:

六,程序链接如下:

点击打开链接

Directx11基础教程一之Directx11框架相关推荐

  1. Directx11基础教程二之Directx11初始化

    一,看本节教程前应该掌握: (1)掌握  D3D11基础教程一之D3D11框架 二,程序的结构如下: 具体在VS2015的代码: 三,程序的具体代码如下: 好的,下面D3D11的初始化我分为十二个步骤 ...

  2. Ogre3D基础教程一

    文档:教程:基础教程:基础教程一 出自Ogre3D开放资源地带 跳转到: 导航, 搜索 目录 [隐藏] 1 简介 2 从这里开始 2.1 错误排除 2.1.1 编译错误 2.1.2 运行失败 3 OG ...

  3. web前端开发基础教程一

    网页: 网站是指因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合. 网页是网站中的一页,通常是HTML格式的文件,他要通过浏览器来阅读. 网页是构成网站的基本元素,它通常由图 ...

  4. 嵌入式C语言基础教程一

    嵌入式系统C语言编程--背景 嵌入式系统C语言编程修炼之道--软件架构                                                                  ...

  5. 【wordpress基础教程一】:wordpress简介和安装

    一.简介        WordPress是一款免费开源的个人博客系统,但随着版本的不断更新和更多开发者的介入,wordpress已逐渐演变成一款小型的CMS系统,使用它可以制作越来越多类型的网站.目 ...

  6. ATOM基础教程一linter-php配置(12)

    linter-php简介 linter-php是自动检查php语法错误的插件,使用起来非常方便. linter-php配置 进入linter-php的配置页面,需要指定php执行文件路径: 因为ATO ...

  7. 麒麟子Javascript游戏编程零基础教程一:序言

    恭喜你,没有被课程大纲吓到,读到这一页的时候,表示你已经下定决心要开始学习了. 然而这一页你依然看不到什么实际的内容.因为这一页我们主要是聊聊人生,谈谈感情. 每一个游戏从业者,心中都有一个自己想做的 ...

  8. IDAPython基础教程一

    给出的文件名为rabbithole 首先使用file命令查看一下 可以看到是64位的可执行文件 接下来我们切换到win,使用IDApro载入,以此文件为样例,学习IDAPython的用法. 首先介绍下 ...

  9. 小程序云开发基础教程一

    接触到云函数已经有一段时间了,之前一直在看api,现在自己跟着网络上的资料和视频学习,做了一个小项目,类似于豆瓣读书系列. 具体是这样的一个流程,后面会一步步的实现. 小程序扫码实现读取isbn,获取 ...

最新文章

  1. 内存淘汰算法_「承」Redis 原理篇——Redis 的内存回收机制
  2. 用初次训练的SVM+HOG分类器在负样本原图上检测HardExample
  3. 2.8 Adam 优化算法
  4. flask-mail异步发送邮件_Spring Boot与异步任务、定时任务、邮件任务
  5. 【2000*】【Codeforces Round #518 (Div. 1) [Thanks, Mail.Ru!] B】Multihedgehog
  6. java 卡密_【java实现点卡生成】
  7. 一键报警(IP对讲)
  8. Linux下OpenCV摄像头录像(c++)
  9. 最好的远程桌面破解软件frdpb_v2
  10. js牛客网、赛码网输入输出
  11. GSoC: GitHub Checks API 项目第三阶段总结
  12. 计算机中丢失d3dx941,d3dx9_41.dll(支持64位)
  13. 金蝶K3总账期初数据录入案例教程
  14. 拼多多企业入驻条件是什么?和个人入驻有啥区别?
  15. java 程序员英语自我介绍_程序员英语面试自我介绍范文
  16. 黎明觉醒火种测试服务器维护,黎明觉醒3月25日开启火种测试
  17. 服务器如何ghost系统安装,如何在Ubuntu Server 14.04 LTS上安装Ghost
  18. 微软面试经历和相关思考总结
  19. win8系统桌面计算机,进入Win8系统 你想拥有Win8的桌面吗?
  20. 力控-照明系统设计与实现

热门文章

  1. cesium three性能比较_基督教/天主教/东正教/犹太教圣经简单比较
  2. Veracrypt :protection of hidden volumes against damage:如何防止隐藏加密卷的内容被损坏
  3. OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法
  4. 自学笔记之计算机网络(3)--奈奎斯特定理与香农定理
  5. C++计时器使用(WIN10系统)
  6. 联想微型计算机机箱拆解,联想锋行机箱接线方法 联想锋行机箱拆解改造步骤...
  7. Valens HDBaseT VA7044/VA7024 视频传输IC
  8. 无法启动此程序 因为计算机中丢失qt5,电脑提示系统丢失Qt5core.dll怎么办?-解决电脑中丢失Qt5core.dll的方法 - 河东软件园...
  9. 物理机安装CentOS7系统
  10. 海马玩模拟器卸载后怎么恢复Virtualbox