OBS-D3D11渲染梳理
+ -

ShaderProcessor参数常量空间

2026-02-02 12 0

如对于如下的像素着色器:

static const bool obs_glsl_compile = false;

uniform float4x4 ViewProj;
uniform float4 color;

struct SolidColoredVertInOut {
    float4 pos : SV_Position;
    float4 color : COLOR;
};

SolidColoredVertInOut VSSolidColored(SolidColoredVertInOut vert_in)
{
    SolidColoredVertInOut vert_out;
    vert_out.pos   = mul(float4(vert_in.pos.xyz, 1.0), ViewProj);
    vert_out.color = vert_in.color;
    return vert_out;
}

SolidColoredVertInOut main(SolidColoredVertInOut vert_in)
{
    return VSSolidColored(vert_in);
}

参数为ViewProj和color

变量 类型
name “ViewProj” std::string
type GS_SHADER_PARAM_MATRIX4X4 (11) gs_shader_param_type
textureID 0 unsigned int
nextSampler 0x0000000000000000 gs_sampler_state *
arrayCount 0 int
pos 0 unsigned __int64
curValue { size=0 } std::vector<unsigned char>
defaultValue { size=0 } std::vector<unsigned char>
changed false bool
变量名 类型
name “color” std::string
type GS_SHADER_PARAM_VEC4 (7) gs_shader_param_type
textureID 0 unsigned int
nextSampler 0x0000000000000000 gs_sampler_state *
arrayCount 0 int
pos 0 unsigned __int64
curValue { size=0 } std::vector<unsigned char>
defaultValue { size=0 } std::vector<unsigned char>
changed false bool

这些参数最终以vector<gs_shader_param> params形式存储,类型为:

struct gs_shader_param {
    string name;
    gs_shader_param_type type;

    uint32_t textureID;
    struct gs_sampler_state *nextSampler = nullptr;

    int arrayCount;

    size_t pos;

    vector<uint8_t> curValue;
    vector<uint8_t> defaultValue;
    bool changed;

    gs_shader_param(shader_var &var, uint32_t &texCounter);
};

创建常量缓冲区

创建常量缓冲区需要计算内存大小,则根据参数的类型和个数计算总和,并进行4位对齐

    D3D11_BUFFER_DESC cbd;
    ZeroMemory(&cbd, sizeof(cbd));
    cbd.Usage = D3D11_USAGE_DYNAMIC;
    cbd.ByteWidth = (constantSize + 15) & 0xFFFFFFF0;
    cbd.BindFlags = D3D11_CPU_ACCESS_WRITE;
    cbd.CPUAccessFlags = 0;

创建了常量空间缓冲区之后,后续就是通过配置gs_shader_param的默认参数,即通过默认参数初始化当前参数。

实际上由于curValue和defaultValue的size()=0,没有进行初始化。

    for (size_t i = 0; i < params.size(); i++)
        gs_shader_set_default(&params[i]);

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!