我可以使用不同的资源绑定对相同的 HLSL 函数进行着色 link 两次吗?

Can I shader link the same HLSL function twice with different resource bindings?

假设我有以下内容:

Texture2D texture : register(t0);
SamplerState sampler : register(s0);

export float4 Sample(float2 uv) { return texture.Sample(sampler, uv); }

export float4 Multiply(float4 lhs, float4 rhs) { return lhs * rhs; }

我可以使用这样的着色器库和着色器链接来实现 Multiply(Sample_0(uv), Sample_1(uv)),其中 Sample_nSample 方法的一个实例,重新映射为使用纹理和采样器寄存器 n(所以每次调用都会采样自己的纹理)?

问题是 API 公开了 ID3D11ModuleInstance 上的资源重新映射,但是 ID3D11FunctionLinkingGraph::CallFunction 函数将 ID3D11Module 作为参数,所以我没有看到两个不同的调用如何与同一模块的两个不同模块实例相关联,但具有不同的重新映射。

是的,你可以。

CallFunction 接受 ID3D11Module 只是为了函数签名(验证目的),但它也接受一个可选的 pModuleInstanceNamespace,它允许您指定特定的模块实例命名空间link 到。

在您调用 Link 之前,FLG 接口实际上并不 link 到特定的模块实例。那时它 links 到已添加到 linker 的模块实例。

这样,一个FLG可以link到不同场景下的不同模块实例。

此外,无需在图形构建之前创建和设置模块实例。