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的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
随机推荐
- 微信小程序-图片、录音、音频播放、音乐播放、视屏、文件
图片: wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 注:文件的临时路径,在小程序本次启动期间可以正常使用,如需持久保存,需在主动调用 wx ...
- 如何在IamgeButton上面添加文字
如何在IamgeButton上面添加文字? 首先要知道,IamgeButton是不可以直接添加文字的.所以我们需要间接制作一个Button按钮 我的代码将会展示另外一个例子,与本文中的代码相似. 本文 ...
- sprint2的总结及团队贡献分
本次sprint做了订餐方法,用户可以通过搜索餐桌号进行点餐,查看已点的东西,也可以删除自己不想要的,当订单进入厨房时,厨房根据订单的顺序先后排列做餐,用户也可以通过扫描餐桌的二维码进行点餐. 148 ...
- JVM 新生代老年代
1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
- 1007. Maximum Subsequence Sum (25)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
- CSUOJ_1002
/* * Title : A+B(III) * Data : 2016/11/09 * Author : Andrew */ #include <iostream> #include &l ...
- npm相关
npm list -g --depth 0 : -g 列出所有全局模块,--depth 使列表只列出简略信息,如包名.版本号
- RESTFUL API 安全设计指南
RESTFUL API 安全设计指南 xxlegend · 2015/10/18 15:08 0x01 REST API 简介 REST的全称是REpresentational State Trans ...
- 转!!负载均衡器技术Nginx和F5的优缺点对比
对于数据流量过大的网络中,往往单一设备无法承担,需要多台设备进行数据分流,而负载均衡器就是用来将数据分流到多台设备的一个转发器. 目前有许多不同的负载均衡技术用以满足不同的应用需求,如软/硬件负载均衡 ...
- openssl evp 对称加密(AES_ecb,ccb)
openssl evp 对称加密(AES_ecb,ccb) evp.h 封装了openssl常用密码学工具,以下主要说对称加密的接口 1. 如下使用 aes_256_ecb 模式的加密解密测试代码 u ...