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

时间:2022-08-31 12:14:00

这是框架的第三层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的更多相关文章

  1. C&plus;&plus;小项目:directx11图形程序(一):主框架

    最近在学习DIRECTX11,在学习过程中编写了一个程序,到现在发现这个程序也有几行代码了,结构还算整齐,就想把这个程序分享出来,其中涉及到了C++程序的架构,windows窗口程序编写,和Direc ...

  2. C&plus;&plus;小项目:directx11图形程序(四):d3dclass

    主菜终于来了.这个d3dclass主要做的工作是dx11图形程序的初始化工作,它将创建显示表面交换链,d3d设备,d3d设备上下文,渲染目标表面,深度模板缓存:设置视口,生成投影矩阵. D3D设备:可 ...

  3. C&plus;&plus;小项目:directx11图形程序(九):总结

    整篇文章中对于directx11的知识的介绍并不多,我也不知道怎么介绍,也应该说对于directx,它有它自己的部分,比如设备(device),设备上下文(devicecontext),顶点缓存,索引 ...

  4. C&plus;&plus;小项目:directx11图形程序(二):systemclass

    先上代码: systemclass.h #pragma once #include"graphicsclass.h" const bool FULLSCREEN = true; c ...

  5. C&plus;&plus;小项目:directx11图形程序(八):particleSysclass

    粒子系统类,粒子系统是游戏里细小元素的控制系统,虽然感觉上它对游戏的影响不大,但是其实有了它能给游戏增色不少.粒子系统控制着细小元素的生死,运动,纹理.对它的编写让我知道,游戏里的这一片从天空飘落的雪 ...

  6. C&plus;&plus;小项目:directx11图形程序(七):modelclass

    模型类是世界空间中的表示物体的类,那么他的所做的事就是加载模型,移动模型,渲染模型 modelclass.h #pragma once #include <d3d11.h> #includ ...

  7. C&plus;&plus;小项目:directx11图形程序(六):cameraclass

    cameraclass是一个相机类,它的作用是生成非常重要的观察矩阵.本小节涉及到一点数学知识,相对前面需要只是填充,调用,算是比较有趣的吧. cameraclass.h #pragma once # ...

  8. C&plus;&plus;小项目:directx11图形程序(五):shadersclass

    这个类是用来创建着色器并设置输入布局的. 这个类比较特殊,它创建的着色器与Effect文件有关,effect文件是用高级着色语言(hlsl)编写的. shadersclass.h #pragma on ...

  9. Android小项目之七 应用程序的更新安装

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

随机推荐

  1. JavaScript Math 对象方法

    Math 对象方法 方法 描述 abs(x) 返回数的绝对值. acos(x) 返回数的反余弦值. asin(x) 返回数的反正弦值. atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值 ...

  2. php-fpm 进程管理

    2015年2月26日 15:40:15 先查找 PHP-FPM 的进程号 ps -ef | grep php-fpm root Feb12 ? :: php-fpm: master process ( ...

  3. asp&period;net后台对前台脚本的调用

    后台像前台输出要执行的脚本 Response.Write("<script>alert('内容')</script>"); asp.net后台调用前台js脚 ...

  4. iptables-1&period;4&period;19 移植到linux

    ------------------------------------------------------------------------------------------ https://g ...

  5. linux系统下saltstack的安装和配置

    Saltstack是一个新的基础设施管理工具,两大功能:远程执行和配置管理. Saltstack使用Python开发,是一个非常简单易用和轻量级的管理工具.由Master和Minion构成,通过Zer ...

  6. asp&period;net 获得伪静态网址解决微信sdk签名问题

    手机网站是asp.net c#编写的,前几天因为要使用微信SDK在手机网站页面使用分享功能,但是程序使用了伪静态功能.如果原地址是:http://ww.xx.com/news/show.aspx?id ...

  7. BZOJ&period;1009&period;&lbrack;HNOI2008&rsqb;GT考试&lpar;KMP DP 矩阵快速幂&rpar;

    题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...

  8. java concurrent 探秘

    我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...

  9. oracle自定义类型 示例

    ) ); ---自定义类型传参给存储过程,示例如下: create or replace procedure dropWf is cursor c_tenant is and t.id not in ...

  10. matplotlib--设置线条颜色及形状

    一.控制颜色 b--blue c--cyan(青色) g--green k--black m--magenta(紫红色) r--red w--white y--yellow 颜色有三种表示方法,可以用 ...