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(¶ms[i]);
OBS-D3D11渲染梳理





