【DirectX】30-框架的简单梳理

参考教程

Tutorial 27: Reflection

学习记录

  上一篇里, 我们再次的启用了框架,之前的内容里我们已经基本学完了 dx 的基础 api 知识 ,之后多是对其的用法。现在我们使用框架后,虽然觉得应该很轻松使用了,但是还是简单的梳理一下比较好。这一篇便是做此处理,顺便对框架的某些内容做以修改。

1

  以上是从 rastertek 的教程框架截图而来,我想光是看框架的图就已经很明白了。我们的框架以 WinMain 为入口, SystemClass 包含输入 Input 与 Graphics 输出。

  Input 输入较为简单, Graphics 则是包含诸多内容:

  D3DClass 负责对于 D3D 设备的初始化以及统一控制,其封装了 D3D 设备的初始化以及调用等等内容,其声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
////////////////////////////////////////////////////////////////////////////////
// Class name: D3DClass
////////////////////////////////////////////////////////////////////////////////
class D3DClass
{
public:
D3DClass();
D3DClass(const D3DClass&);
~D3DClass();

bool Initialize(int, int, bool, HWND, bool, float, float);
void Shutdown();

void BeginScene(float, float, float, float);
void EndScene();

ID3D11Device* GetDevice();
ID3D11DeviceContext* GetDeviceContext();

void GetProjectionMatrix(D3DXMATRIX&);
void GetWorldMatrix(D3DXMATRIX&);
void GetOrthoMatrix(D3DXMATRIX&);

void TurnZBufferOn();
void TurnZBufferOff();

void TurnOnAlphaBlending();
void TurnOffAlphaBlending();

ID3D11DepthStencilView* GetDepthStencilView();
void SetBackBufferRenderTarget();

private:
bool m_vsync_enabled;

IDXGISwapChain* m_swapChain;
ID3D11Device* m_device;
ID3D11DeviceContext* m_deviceContext;
ID3D11RenderTargetView* m_renderTargetView;
ID3D11Texture2D* m_depthStencilBuffer;
ID3D11DepthStencilState* m_depthStencilState;
ID3D11DepthStencilView* m_depthStencilView;
ID3D11RasterizerState* m_rasterState;

D3DXMATRIX m_projectionMatrix;
D3DXMATRIX m_worldMatrix;
D3DXMATRIX m_orthoMatrix;

ID3D11DepthStencilState* m_depthDisabledStencilState;
ID3D11BlendState* m_alphaEnableBlendingState;
ID3D11BlendState* m_alphaDisableBlendingState;
};

  CameraClass 封装了摄像机操作,其声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
////////////////////////////////////////////////////////////////////////////////
// Class name: CameraClass
////////////////////////////////////////////////////////////////////////////////
class CameraClass
{
public:
CameraClass();
CameraClass(const CameraClass&);
~CameraClass();

void SetPosition(float, float, float);
void SetRotation(float, float, float);

void Render();
void GetViewMatrix(D3DXMATRIX&);

void RenderReflection(float);
D3DXMATRIX GetReflectionViewMatrix();

private:
D3DXMATRIX m_viewMatrix;
float m_positionX, m_positionY, m_positionZ;
float m_rotationX, m_rotationY, m_rotationZ;
D3DXMATRIX m_reflectionViewMatrix;
};

  ModelClass 主要负责模型部分,它包括了模型的渲染,其下有 TextureClass 类负责模型的纹理,声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
////////////////////////////////////////////////////////////////////////////////
// Class name: ModelClass
////////////////////////////////////////////////////////////////////////////////
class ModelClass
{
private:
struct VertexType
{
D3DXVECTOR3 position;
D3DXVECTOR2 texture;
D3DXVECTOR3 normal;
};

struct ModelType
{
float x, y, z;
float tu, tv;
float nx, ny, nz;
};

public:
ModelClass();
ModelClass(const ModelClass&);
~ModelClass();

bool Initialize(ID3D11Device*, char*, char*);
void Shutdown();
void Render(ID3D11DeviceContext*);

int GetIndexCount();
ID3D11ShaderResourceView* GetTexture();

private:
bool InitializeBuffers(ID3D11Device*);
void ShutdownBuffers();
void RenderBuffers(ID3D11DeviceContext*);

bool LoadTexture(ID3D11Device*, char*);
void ReleaseTexture();

bool LoadModel(char*);
void ReleaseModel();

private:
ID3D11Buffer *m_vertexBuffer, *m_indexBuffer;
int m_vertexCount, m_indexCount;
TextureClass* m_Texture;
ModelType* m_model;
};

  TextureClass 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
////////////////////////////////////////////////////////////////////////////////
// Class name: TextureClass
////////////////////////////////////////////////////////////////////////////////
class TextureClass
{
public:
TextureClass();
TextureClass(const TextureClass&);
~TextureClass();

bool Initialize(ID3D11Device*, char*);
void Shutdown();

ID3D11ShaderResourceView* GetTexture();

private:
ID3D11ShaderResourceView* m_texture;
};

  RenderTextureClass 我们封装了离屛渲染的方法,使用它我们可以将画面渲染至纹理以实现一些后期处理。其声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
////////////////////////////////////////////////////////////////////////////////
// Class name: RenderTextureClass
////////////////////////////////////////////////////////////////////////////////
class RenderTextureClass
{
public:
RenderTextureClass();
RenderTextureClass(const RenderTextureClass&);
~RenderTextureClass();

bool Initialize(ID3D11Device*, int, int);
void Shutdown();

void SetRenderTarget(ID3D11DeviceContext*, ID3D11DepthStencilView*);
void ClearRenderTarget(ID3D11DeviceContext*, ID3D11DepthStencilView*, float, float, float, float);
ID3D11ShaderResourceView* GetShaderResourceView();

private:
ID3D11Texture2D* m_renderTargetTexture;
ID3D11RenderTargetView* m_renderTargetView;
ID3D11ShaderResourceView* m_shaderResourceView;
};

  TextureShaderClass 类中,我们主要封装了与 Shader 交互的操作,其他有些特殊的 Shader 类则可以由这个类修改而成。其声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
////////////////////////////////////////////////////////////////////////////////
// Class name: TextureShaderClass
////////////////////////////////////////////////////////////////////////////////
class TextureShaderClass
{
private:
struct MatrixBufferType
{
D3DXMATRIX world;
D3DXMATRIX view;
D3DXMATRIX projection;
};

public:
TextureShaderClass();
TextureShaderClass(const TextureShaderClass&);
~TextureShaderClass();

bool Initialize(ID3D11Device*, HWND);
void Shutdown();
bool Render(ID3D11DeviceContext*, int, D3DXMATRIX, D3DXMATRIX, D3DXMATRIX, ID3D11ShaderResourceView*);

private:
bool InitializeShader(ID3D11Device*, HWND, char*, char*);
void ShutdownShader();
void OutputShaderErrorMessage(ID3D10Blob*, HWND, char*);

bool SetShaderParameters(ID3D11DeviceContext*, D3DXMATRIX, D3DXMATRIX, D3DXMATRIX, ID3D11ShaderResourceView*);
void RenderShader(ID3D11DeviceContext*, int);

private:
ID3D11VertexShader* m_vertexShader;
ID3D11PixelShader* m_pixelShader;
ID3D11InputLayout* m_layout;
ID3D11Buffer* m_matrixBuffer;
ID3D11SamplerState* m_sampleState;
};

  ReflectionShaderClass 则就是以 TextureShaderClass 类为基础的一个特殊类,它封装了反射纹理的操作,在上篇文章中我们使用它来渲染了反射效果,声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
////////////////////////////////////////////////////////////////////////////////
// Class name: ReflectionShaderClass
////////////////////////////////////////////////////////////////////////////////
class ReflectionShaderClass
{
private:
struct MatrixBufferType
{
D3DXMATRIX world;
D3DXMATRIX view;
D3DXMATRIX projection;
};

struct ReflectionBufferType
{
D3DXMATRIX reflectionMatrix;
};

public:
ReflectionShaderClass();
ReflectionShaderClass(const ReflectionShaderClass&);
~ReflectionShaderClass();

bool Initialize(ID3D11Device*, HWND);
void Shutdown();
bool Render(ID3D11DeviceContext*, int, D3DXMATRIX, D3DXMATRIX, D3DXMATRIX, ID3D11ShaderResourceView*,
ID3D11ShaderResourceView*, D3DXMATRIX);

private:
bool InitializeShader(ID3D11Device*, HWND, char*, char*);
void ShutdownShader();
void OutputShaderErrorMessage(ID3D10Blob*, HWND, char*);

bool SetShaderParameters(ID3D11DeviceContext*, D3DXMATRIX, D3DXMATRIX, D3DXMATRIX, ID3D11ShaderResourceView*,
ID3D11ShaderResourceView*, D3DXMATRIX);
void RenderShader(ID3D11DeviceContext*, int);

private:
ID3D11VertexShader* m_vertexShader;
ID3D11PixelShader* m_pixelShader;
ID3D11InputLayout* m_layout;
ID3D11Buffer* m_matrixBuffer;
ID3D11SamplerState* m_sampleState;
ID3D11Buffer* m_reflectionBuffer;
};

  对于框架的更改,我们只是简单的对所使用的数学库进行升级,使用 DirectXMath 数学库,修改的内容比较多,所以不在此完整列出,源代码可以直接下载。

  源代码:DX11Tutorial-ScreenFades

0%