D3D11教程三十六之ManagingMultipleShaders(组织多个Shader)

来源:互联网 发布:友价商城t5源码 编辑:程序博客网 时间:2024/05/17 01:20

这教程是关于如何组织多个Shader类的,程序的结构如下:






在看这个教程前得看得懂:D3D11教程十二之NormalMap(法线贴图) 和  D3D11教程十三之SpecularMap(高光贴图)



前面的教程系列我们创建的Shader类往往是独立的,用起来有些麻烦,这次我们把各个Shader类放到一个ShaderManagerClass类里,然后在ShaderManagerClass提供相应的接口,这里运用了软件设计模式。

这里ShaderManagerClass类给出了对应于各个Shader类的Render接口,下面给ShaderManagerClass的代码:


ShaderManagerClass.h

#pragma once#ifndef _SHADER_MANAGER_CLASS#define _SHADER_MANAGER_CLASS#include"BumpShaderClass.h"#include"SpecularShaderClass.h"class ShaderManagerClass{private:BumpShaderClass* mBumpShaderClass;SpecularShaderClass* mSpecularShaderClass;public:ShaderManagerClass();~ShaderManagerClass();ShaderManagerClass(const ShaderManagerClass&);bool Initialize(ID3D11Device* d3dDevice, HWND hwnd);void Shutdown();//对外的Render方法接口bool RenderBumpShader(ID3D11DeviceContext* d3dDeviceContext, int indexCount, CXMMATRIX WorldMatrix, CXMMATRIX ViewMatrix, CXMMATRIX ProjMatrix, ID3D11ShaderResourceView** Texture, FXMVECTOR diffuseColor, FXMVECTOR LightDirection, FXMVECTOR AmbientColor);bool RenderSpecularShader(ID3D11DeviceContext* d3dDeviceContext, int indexCount, CXMMATRIX WorldMatrix, CXMMATRIX ViewMatrix, CXMMATRIX ProjMatrix, ID3D11ShaderResourceView** Texture, FXMVECTOR diffuseColor, FXMVECTOR LightDirection, FXMVECTOR AmbientColor, CXMVECTOR SpecularColor, float SpecularPow, CXMVECTOR CameraPos);};#endif // !_SHADER_MANAGER_CLASS




ShaderManagerClass.CPP

#include"ShaderManagerClass.h"ShaderManagerClass::ShaderManagerClass(){mSpecularShaderClass = NULL;mBumpShaderClass = NULL;}ShaderManagerClass::~ShaderManagerClass(){}ShaderManagerClass::ShaderManagerClass(const ShaderManagerClass& other){}bool ShaderManagerClass::Initialize(ID3D11Device* d3dDevice, HWND hwnd){bool result;//第一,创建以及初始化BumpShaderClassmBumpShaderClass = new BumpShaderClass();if (!mBumpShaderClass){return false;}result = mBumpShaderClass->Initialize(d3dDevice,hwnd);if (!result){MessageBox(hwnd, L"mBumpShaderClass初始化失败", NULL, MB_OK);return false;}//第二,创建以及初始化SpecularShaderClassmSpecularShaderClass= new SpecularShaderClass();if (!mSpecularShaderClass){return false;}result = mSpecularShaderClass->Initialize(d3dDevice, hwnd);if (!result){MessageBox(hwnd, L"mSpecularShaderClass初始化失败", NULL, MB_OK);return false;}return true;}void  ShaderManagerClass::Shutdown(){ReleaseShaderClass(mSpecularShaderClass);ReleaseShaderClass(mBumpShaderClass);}bool ShaderManagerClass::RenderBumpShader(ID3D11DeviceContext* d3dDeviceContext, int indexCount, CXMMATRIX WorldMatrix, CXMMATRIX ViewMatrix, CXMMATRIX ProjMatrix, ID3D11ShaderResourceView** Texture, FXMVECTOR diffuseColor, FXMVECTOR LightDirection, FXMVECTOR AmbientColor){bool result;result = mBumpShaderClass->Render(d3dDeviceContext, indexCount, WorldMatrix, ViewMatrix, ProjMatrix, Texture, diffuseColor, LightDirection, AmbientColor);if (!result){MessageBox(NULL, L"mBumpShaderClass render 失败", NULL, MB_OK);return false;}return true;}bool ShaderManagerClass::RenderSpecularShader(ID3D11DeviceContext* d3dDeviceContext, int indexCount, CXMMATRIX WorldMatrix, CXMMATRIX ViewMatrix, CXMMATRIX ProjMatrix, ID3D11ShaderResourceView** Texture, FXMVECTOR diffuseColor, FXMVECTOR LightDirection, FXMVECTOR AmbientColor, CXMVECTOR SpecularColor, float SpecularPow, CXMVECTOR CameraPos){bool result;result = mSpecularShaderClass->Render(d3dDeviceContext, indexCount, WorldMatrix, ViewMatrix, ProjMatrix, Texture, diffuseColor, LightDirection, AmbientColor, SpecularColor, SpecularPow, CameraPos);if (!result){MessageBox(NULL, L"mSpecularShaderClass render 失败", NULL, MB_OK);return false;}return true;}


程序最后运行的的结果:




下面放出我的源代码链接:

http://download.csdn.net/detail/qq_29523119/9682595

0 0