Parameter System

参数类型

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值