C++小项目:directx11图形程序(三):graphicsclass

这是框架的第三层graphicsclass,这个类才真正可以说是整个程序的框架,因为它组织了后面所有的成员。

代码:

graphicsclass.h

 1 #pragma once
 2 #include<Windows.h>
 3 #include <d3d11.h>
 4 #include <d3dcompiler.h>
 5 #include <D3DX11.h>
 6 #include <xnamath.h>
 7 
 8 #include"cameraclass.h"
 9 #include"d3dclass.h"
10 #include"modelclass.h"
11 #include"shaderclass.h"
12 #include"inputclass.h"
13 #include"particleSysclass.h"
14 
15 #pragma comment(lib,"d3dx11.lib")
16 #pragma comment(lib,"d3d11.lib")
17 #pragma comment(lib,"d3dcompiler.lib")
18 class graphicsclass
19 {
20 public:
21     graphicsclass();
22     ~graphicsclass();
23     bool Initialize(HWND hWnd );
24     void Shutdown();
25     bool Frame();
26 
27 private:        
28     d3dclass* m_d3d;
29     shaderclass* m_shader;
30     cameraclass* m_camera;
31     modelclass* m_model;
32     modelclass* m_model1;
33     inputclass* m_input;
34     particleSysclass *m_particles;
35 
36     ID3D11Device* m_device;
37     ID3D11DeviceContext* m_context;
38 };

从这个头文件里可以看到,首先包含了directx11开发需要用到的头文件和lib,其次包含了我自己写的也是框架出现过的类的头文件。从私有数据成员里也可窥见一斑。

但是多了两个

ID3D11Device* m_device;
ID3D11DeviceContext* m_context;

这样的指针。简单介绍一下,ID3D11Device是dx11的设备对象,ID3D11DeviceContext是dx11的设备上下文对象。在当前类里面并不涉及他们的创建。我们在这里申明它只是用来起一个桥梁作用。

graphicsclass.cpp

  1 #include "graphicsclass.h"
  2 
  3 graphicsclass::graphicsclass()
  4 {
  5 }
  6 graphicsclass::~graphicsclass()
  7 {
  8 }
  9 bool graphicsclass::Initialize(HWND hWnd)
 10 {
 11     
 12     m_d3d = new d3dclass;
 13     m_d3d->Initialize(hWnd);
 14     m_d3d->Getdevice(m_device);
 15     m_d3d->Getcontext(m_context);
 16 
 17     m_shader = new shaderclass;    
 18     m_shader->Initialize(m_device, m_context);
 19 
 20     m_camera = new cameraclass;
 21     
 22     m_model = new modelclass;
 23     m_model->Initialize(m_device, L"cube.txt", L"dx11.dds");
 24 
 25     m_model1 = new modelclass;
 26     m_model1->Initialize(m_device, L"cube.txt", L"stone.dds");
 27 
 28     m_input = new inputclass;
 29     m_input->Initialize(hWnd);
 30 
 31     m_particles = new particleSysclass;
 32     m_particles->Initialize(m_device, L"star.dds", 20);
 33     
 34     return true;
 35 }
 36 void graphicsclass::Shutdown()
 37 {
 38     m_input->Shutdown();
 39     delete m_input;
 40 
 41     m_model1->Shutdown();
 42     delete m_model1;
 43 
 44     m_model->Shutdown();
 45     delete m_model;
 46 
 47     delete m_camera;
 48 
 49     m_shader->Shutdown();
 50     delete m_shader;
 51 
 52     m_d3d->Shutdown();
 53     delete m_d3d;
 54 }
 55 bool graphicsclass::Frame()
 56 {
 57     if (m_input->keydown(DIK_ESCAPE))
 58     {
 59         return false;
 60     }
 61 
 62     static float t = 0;
 63     t += 0.002f;
 64 
 65     XMMATRIX view,pro;
 66     m_d3d->Getpromtrx(pro);
 67 
 68     static float r = 0, n = 0, m = 1;
 69     int a = 0, b = 0, z = 0;
 70     if (m_input->mouseinput(0))
 71     {
 72         m_input->GetmouseI(a, b);
 73         
 74     }
 75     r += a,n += b;    
 76     
 77     m += z;
 78     m_camera->SetPositon(0, 0, -6);
 79     m_camera->SetRotation(n/50, r/50, 0);
 80     m_camera->Getviewmatrix(view);
 81 
 82     XMVECTOR axis = { 0, 1, 0 };
 83     m_model->Setposition(0, 1, 0);
 84     m_model1->Setposition(0, 0, 5);
 85     m_model1->RotationAxis(axis, 90);
 86     m_model->RotationAxis(axis, t);    
 87 
 88     ID3D11VertexShader* vertexshader;
 89     ID3D11PixelShader* pixelshader;
 90     m_shader->GetShaders(vertexshader, pixelshader);
 91 
 92     m_d3d->Beginrender(0, 0, 0, 0);
 93 
 94     m_model->Render(m_context, view, pro, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, vertexshader, pixelshader);
 95     m_model1->Render(m_context, view, pro, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, vertexshader, pixelshader);    
 96     m_particles->Render(m_context, view, pro, vertexshader, pixelshader);
 97 
 98     m_d3d->Endrender();
 99     return true;
100 }

这段代码,我个人的感觉是非常的整齐。

Initialize()函数:就是创建对象,初始化,创建对象,初始化.....。不过与众不同的是,使用了m_d3d的Getdevice()和Getcontext()。为什么要使用呢?因为后面对象的初始化要用到ID3D11Device和ID3D11DeviceContext对象啊。这就是我所说的起到的桥梁的作用

Shutdown()函数:依然是调用组件的Shutdown()函数并释放他们,起到一个析构函数的作用

Frame()函数:调用组件的各个函数,可能是输入检测,可能是设置位置,可能是获取组件的成员,也可能是渲染。

依然好像没有涉及dx11的图形渲染。但是我们可以看到,涉及图形渲染的部分一定就在这个类所管理的组件里面了。还是继续看接下来的对各个组件的介绍吧。

原文地址:https://www.cnblogs.com/woody-245/p/5577351.html