参数类型
enum ParameterType
{
// 数值
VECTOR ,
MATRIX ,
MATRIX_ARRAY ,
// 资源视图
SHADER_RESOURCE ,
UNORDERED_ACCESS ,
CBUFFER ,
SAMPLER ,
ENTITY
}
这些都是Shader中的各种参数
RenderParameterDX11
此类为参数类的基类,定义了参数类应该具有的基本功能
class RenderParameterDX11
{
public:
RenderParameterDX11();
virtual ~RenderParameterDX11();
void SetName(const std::wstring& name);
std::wstring& GetName();
virtual const ParameterType GetParameterType() = 0;
void InitializeParameterData(void* pData);
virtual void SetParameterData(void* pData , unsigned int thread_ID = 0) = 0;
unsigned int GetValueID(unsigned int threadID = 0);
protected:
// 参数名
std::wstring m_sParameterName;
// 主要用于ConstantBuffer检测其各字段的参数值是否发生改变
// 当我们修改cbuffer的某字段的值时,则该字段的m_auiValueID
// 值自增,我们检测该字段的m_auiValueID发生过变化,则说明
// 该参数被修改过,则更新ConstantBuffer
unsigned int m_auiValueID[NUM_THREADS + 1];
}
参数类主体
参数类大体分为两部分:
一:Vector , Matrix , MatrixArray
二:ShaderResource , UnorderedAccess , ConstantBuffer , Sampler
第一类自己保存数据,第二类只是保存索引,数据保存在Renderer的管理器中
首先看一下VectorParameterDX11
class VectorParameterDX11 : public RenderParameter
{
public:
VectorParameterDX11();
VectorParameterDX11(VectorParameterDX11& copy);
virtual ~VectorParameterDX11();
virtual void SetParameterData(void* pData , unsigned int threadID = 0);
virtual const ParameterType GetParameterType();
Vector4f GetVector(unsigned int threadID = 0);
void SetVector(Vector4f v , unsigned int threadID = 0);
protected:
Vector4f m_Vector[NUM_THREADS + 1];
};
从代码中我们看到,VectorParameter自己保存了Vector的值
下面我们再看一段ShaderResourceParameterDX11的代码:
class ShaderResourceParameterDX11
{
public:
ShaderResourceParameterDX11();
ShaderResourceParameterDX11(ShaderResourceParameterDX11& copy);
virtual ~ShaderResourceParameterDX11();
virtual void SetParameterData(void* pData , unsigned int threadID = 0);
virtual const ParameterType GetParameterType();
int GetIndex(unsigned int threadID);
protected:
// 索引ID
int m_iShaderResourceViews[NUM_THREADS+1];
}
能够发现ShaderResourceParameterDX11保存是一个整数值,是一个索引ID,通过该索引我们可以再renderer中快速存取ShaderResourceViewDX11对象(封装了ShaderResourceView对象)
ParameterWriter
该类封装了为Parameter类写入数据的功能
ParameterWriter为基类:
VectorParameterWriter用于为VectorParameterDX11写入数据,将VectorParameterDX11对象和要写入的值封装到了一起
ShaderResourceWriter用于为ShaderResourceParameterWriterDX11对象写入数据,将ShaderResourceParameterDX11对象和要写入的值保存在一起
我们会注意到这里数据成员有一个ResourcePtr m_Value , 而不是int m_Value , 因为ResourceView总是和Resource相关联在一起,因此我们使用ResourcePtr中的m_iResourceSRV更合适一点
SamplerParameterWriterDX11如下:
该类中数据成员为int m_Value用于保存要写入的ID3D11Sampler对象的索引
ParameterContainer
该类用于管理ParameterWriter对象
class ParameterContainer
{
public:
void AddRenderParameter(ParameterWriter* pWriter);
/*
根据name获取ParameterWriter对象
若存在,则类型符合,则返回该对象
否则,返回nullptr
*/
ParameterWriter* GetRenderParameterWriter(const std::wstring& name);
VectorParameterWriteDX11* GetVectorParameterWriter(const std::wstring& name);
...
/*
功能:为指定名称的ParameterWriter设置value
method:根据name在ParameterWriter容器中查找
是否存在对应的ParameterWriter对象
若不存在,则为该名字的Parameter创建
一个ParameterWriter对象
调用SetValue设置value
*/
VectorParameterWriterDX11* SetVectorParameter(const std::string& name , const Vector4f& value);
...
/*
功能:将m_RenderParameter中所有的
ParameterWriter的value都写入到
ParameterWriter所对应的Parameter里
即更新所有的渲染参数信息
只有需要更新的参数才会为其创建ParameterWriter,
并通过m_RenderParams统一管理
更新渲染参数的步骤:
一:对所有的渲染参数(需要更新的)调用SetXXXParameter()
二:调用SetRenderParams将所有的渲染参数更新
*/
void SetRenderParams(IParameterManager* pParameterManager);
void InitRenderParams();
protected:
std::vector<ParameterWriter*> m_RenderParameter;
}