OBS-D3D11渲染梳理
+ -

ShaderProcessor 着色器采样

2026-02-03 1 0

有着色器代码如下:

static const bool obs_glsl_compile = false;

uniform Texture2D image;

SamplerState def_sampler {
    Filter = Linear;
    AddressU = Clamp;
    AddressV = Clamp;
};

struct VertInOut {
    float4 pos : SV_Position;
    float2 uv : TEXCOORD0;
};

float4 PSDrawBare(VertInOut vert_in)
{
    return image.Sample(def_sampler, vert_in.uv);
}

float4 main(VertInOut vert_in) : SV_Target
{
    return PSDrawBare(vert_in);
}

采样其存于vector<unique_ptr<ShaderSampler>> samplers
其对应的结构体为

struct shader_sampler {
    char *name;
    DARRAY(char *) states;
    DARRAY(char *) values;
};


struct ShaderSampler {
    string name;
    gs_sampler_state sampler;

    inline ShaderSampler(const char *name, gs_device_t *device,
                 gs_sampler_info *info)
        : name(name), sampler(device, info)
    {
    }
};


gs_sampler_state::gs_sampler_state(gs_device_t *device,
                   const gs_sampler_info *info)
    : gs_obj(device, gs_type::gs_sampler_state), info(*info)
{
    HRESULT hr;
    vec4 v4;

    memset(&sd, 0, sizeof(sd));
    sd.AddressU = ConvertGSAddressMode(info->address_u);
    sd.AddressV = ConvertGSAddressMode(info->address_v);
    sd.AddressW = ConvertGSAddressMode(info->address_w);
    sd.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
    sd.Filter = ConvertGSFilter(info->filter);
    sd.MaxAnisotropy = info->max_anisotropy;
    sd.MaxLOD = FLT_MAX;

    vec4_from_rgba(&v4, info->border_color);
    memcpy(sd.BorderColor, v4.ptr, sizeof(v4));

    hr = device->device->CreateSamplerState(&sd, state.Assign());
    if (FAILED(hr))
        throw HRError("Failed to create sampler state", hr);
}

状态转换为:

void shader_sampler_convert(struct shader_sampler *ss,
                struct gs_sampler_info *info)
{
    size_t i;
    memset(info, 0, sizeof(struct gs_sampler_info));

    info->max_anisotropy = 1;

    for (i = 0; i < ss->states.num; i++) {
        const char *state = ss->states.array[i];
        const char *value = ss->values.array[i];

        if (astrcmpi(state, "Filter") == 0)
            info->filter = get_sample_filter(value);
        else if (astrcmpi(state, "AddressU") == 0)
            info->address_u = get_address_mode(value);
        else if (astrcmpi(state, "AddressV") == 0)
            info->address_v = get_address_mode(value);
        else if (astrcmpi(state, "AddressW") == 0)
            info->address_w = get_address_mode(value);
        else if (astrcmpi(state, "MaxAnisotropy") == 0)
            info->max_anisotropy = (int)strtol(value, NULL, 10);
        else if (astrcmpi(state, "BorderColor") == 0)
            info->border_color = strtol(value + 1, NULL, 16);
    }
}

0 篇笔记 写笔记

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

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

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