C++小项目:directx11图形程序(三):graphicsclass
这是框架的第三层graphicsclass,这个类才真正可以说是整个程序的框架,因为它组织了后面所有的成员。
代码:
graphicsclass.h
#pragma once
#include<Windows.h>
#include <d3d11.h>
#include <d3dcompiler.h>
#include <D3DX11.h>
#include <xnamath.h> #include"cameraclass.h"
#include"d3dclass.h"
#include"modelclass.h"
#include"shaderclass.h"
#include"inputclass.h"
#include"particleSysclass.h" #pragma comment(lib,"d3dx11.lib")
#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"d3dcompiler.lib")
class graphicsclass
{
public:
graphicsclass();
~graphicsclass();
bool Initialize(HWND hWnd );
void Shutdown();
bool Frame(); private:
d3dclass* m_d3d;
shaderclass* m_shader;
cameraclass* m_camera;
modelclass* m_model;
modelclass* m_model1;
inputclass* m_input;
particleSysclass *m_particles; ID3D11Device* m_device;
ID3D11DeviceContext* m_context;
};
从这个头文件里可以看到,首先包含了directx11开发需要用到的头文件和lib,其次包含了我自己写的也是框架出现过的类的头文件。从私有数据成员里也可窥见一斑。
但是多了两个
ID3D11Device* m_device;
ID3D11DeviceContext* m_context;
这样的指针。简单介绍一下,ID3D11Device是dx11的设备对象,ID3D11DeviceContext是dx11的设备上下文对象。在当前类里面并不涉及他们的创建。我们在这里申明它只是用来起一个桥梁作用。
graphicsclass.cpp
#include "graphicsclass.h" graphicsclass::graphicsclass()
{
}
graphicsclass::~graphicsclass()
{
}
bool graphicsclass::Initialize(HWND hWnd)
{ m_d3d = new d3dclass;
m_d3d->Initialize(hWnd);
m_d3d->Getdevice(m_device);
m_d3d->Getcontext(m_context); m_shader = new shaderclass;
m_shader->Initialize(m_device, m_context); m_camera = new cameraclass; m_model = new modelclass;
m_model->Initialize(m_device, L"cube.txt", L"dx11.dds"); m_model1 = new modelclass;
m_model1->Initialize(m_device, L"cube.txt", L"stone.dds"); m_input = new inputclass;
m_input->Initialize(hWnd); m_particles = new particleSysclass;
m_particles->Initialize(m_device, L"star.dds", ); return true;
}
void graphicsclass::Shutdown()
{
m_input->Shutdown();
delete m_input; m_model1->Shutdown();
delete m_model1; m_model->Shutdown();
delete m_model; delete m_camera; m_shader->Shutdown();
delete m_shader; m_d3d->Shutdown();
delete m_d3d;
}
bool graphicsclass::Frame()
{
if (m_input->keydown(DIK_ESCAPE))
{
return false;
} static float t = ;
t += 0.002f; XMMATRIX view,pro;
m_d3d->Getpromtrx(pro); static float r = , n = , m = ;
int a = , b = , z = ;
if (m_input->mouseinput())
{
m_input->GetmouseI(a, b); }
r += a,n += b; m += z;
m_camera->SetPositon(, , -);
m_camera->SetRotation(n/, r/, );
m_camera->Getviewmatrix(view); XMVECTOR axis = { , , };
m_model->Setposition(, , );
m_model1->Setposition(, , );
m_model1->RotationAxis(axis, );
m_model->RotationAxis(axis, t); ID3D11VertexShader* vertexshader;
ID3D11PixelShader* pixelshader;
m_shader->GetShaders(vertexshader, pixelshader); m_d3d->Beginrender(, , , ); m_model->Render(m_context, view, pro, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, vertexshader, pixelshader);
m_model1->Render(m_context, view, pro, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, vertexshader, pixelshader);
m_particles->Render(m_context, view, pro, vertexshader, pixelshader); m_d3d->Endrender();
return true;
}
这段代码,我个人的感觉是非常的整齐。
Initialize()函数:就是创建对象,初始化,创建对象,初始化.....。不过与众不同的是,使用了m_d3d的Getdevice()和Getcontext()。为什么要使用呢?因为后面对象的初始化要用到ID3D11Device和ID3D11DeviceContext对象啊。这就是我所说的起到的桥梁的作用
Shutdown()函数:依然是调用组件的Shutdown()函数并释放他们,起到一个析构函数的作用
Frame()函数:调用组件的各个函数,可能是输入检测,可能是设置位置,可能是获取组件的成员,也可能是渲染。
依然好像没有涉及dx11的图形渲染。但是我们可以看到,涉及图形渲染的部分一定就在这个类所管理的组件里面了。还是继续看接下来的对各个组件的介绍吧。
C++小项目:directx11图形程序(三):graphicsclass的更多相关文章
- C++小项目:directx11图形程序(一):主框架
最近在学习DIRECTX11,在学习过程中编写了一个程序,到现在发现这个程序也有几行代码了,结构还算整齐,就想把这个程序分享出来,其中涉及到了C++程序的架构,windows窗口程序编写,和Direc ...
- C++小项目:directx11图形程序(四):d3dclass
主菜终于来了.这个d3dclass主要做的工作是dx11图形程序的初始化工作,它将创建显示表面交换链,d3d设备,d3d设备上下文,渲染目标表面,深度模板缓存:设置视口,生成投影矩阵. D3D设备:可 ...
- C++小项目:directx11图形程序(九):总结
整篇文章中对于directx11的知识的介绍并不多,我也不知道怎么介绍,也应该说对于directx,它有它自己的部分,比如设备(device),设备上下文(devicecontext),顶点缓存,索引 ...
- C++小项目:directx11图形程序(二):systemclass
先上代码: systemclass.h #pragma once #include"graphicsclass.h" const bool FULLSCREEN = true; c ...
- C++小项目:directx11图形程序(八):particleSysclass
粒子系统类,粒子系统是游戏里细小元素的控制系统,虽然感觉上它对游戏的影响不大,但是其实有了它能给游戏增色不少.粒子系统控制着细小元素的生死,运动,纹理.对它的编写让我知道,游戏里的这一片从天空飘落的雪 ...
- C++小项目:directx11图形程序(七):modelclass
模型类是世界空间中的表示物体的类,那么他的所做的事就是加载模型,移动模型,渲染模型 modelclass.h #pragma once #include <d3d11.h> #includ ...
- C++小项目:directx11图形程序(六):cameraclass
cameraclass是一个相机类,它的作用是生成非常重要的观察矩阵.本小节涉及到一点数学知识,相对前面需要只是填充,调用,算是比较有趣的吧. cameraclass.h #pragma once # ...
- C++小项目:directx11图形程序(五):shadersclass
这个类是用来创建着色器并设置输入布局的. 这个类比较特殊,它创建的着色器与Effect文件有关,effect文件是用高级着色语言(hlsl)编写的. shadersclass.h #pragma on ...
- Android小项目之七 应用程序的更新安装
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
随机推荐
- .net mvc利用NPOI导入导出excel
1.导出Excel :首先引用NPOI包(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> ...
- could not read symbols: File format not recognized
arm-linux-gnueabi-readelf工具解决问题 编译一个32位平台的内核时,出现如下错误提示: libschw.a: could not read symbols: File form ...
- Mysql导入导出非常慢解决办法
MySQL导出的SQL语句在导入时有可能会非常非常慢,经历过导入仅45万条记录,竟用了近3个小时.在导出时合理使用几个参数,可以大大加快导入的速度. -e 使用包括几个VALUES列表的多行INSER ...
- Python unittest appium
import unittest from appium import webdriver from appium.common.exceptions import NoSuchContextExcep ...
- nodejs学习笔记之events
events 模块只提供了一个对象: events.EventEmitter. EventEmitter 的核心就是事件触发与事件监听器功能的封装. 可以通过require("events& ...
- merge into在oracle10g和oracle 11g中的使用差别一
oracle10g上的代码 MERGE INTO TCGGYSGHCP CP USING (SELECT * FROM (SELECT QD.LIFNR, ...
- C#基础
.net/dotnet:一般指.NetFramework框架,一种平台,一种技术. c#(sharp):一种编程语言,可以开发基于.net平台的应用. Java:是一种技术,又是一门语言: .net应 ...
- asp.net 解决 "回发或回调参数无效" 一些常见解决方案
一.回发或回调参数无效,出现下图错误, 常见解决方案: 1.在页面的<%@ Page Language="C#" AutoEventWireup="true&qu ...
- 安装Python时遇到如下问题,解决方案
~$ sudo apt-get install python-pip 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 python-pip 已经是最新的版本了 ...
- Jquery动态操作checkbox
问题的由来:html页面中使用checkbox给新建用户授权,然后提交到后台服务器,完成给用户授权.用户授权完成之后,如果用户的权限发生改变管理员需要修改多个用户的权限或查看某用户的权限,点击不同的用 ...