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);
}
}
OBS-D3D11渲染梳理





