2016-08-24 7 views
0

Скажем, у меня есть следующие:Могу ли я шейдеру связывать одну и ту же функцию HLSL дважды с различными привязками ресурсов?

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_n является экземпляром метода Sample переназначен использовать текстуру и пробоотборник регистр n (так каждый вызов образцы собственной текстуры)?

Вопрос заключается в том, что API предоставляет ресурс переназначение на ID3D11ModuleInstance, но функция ID3D11FunctionLinkingGraph::CallFunction принимает ID3D11Module в качестве параметра, так что я не вижу, как две различные вызовы могут быть связаны с двумя различными экземплярами модулей одного и того же модуля, но с различными перенаправлениями.

ответ

3

Да, вы можете.

CallFunction принимает ID3D11Module только для функции подписи (цели проверки), но он также принимает необязательный pModuleInstanceNamespace, который позволяет указать определенное пространство имен экземпляра модуля вы ссылку.

Интерфейс FLG фактически не ссылается на конкретный экземпляр модуля, пока вы не вызовете ссылку. В этот момент он ссылается на экземпляры модулей, которые были добавлены в компоновщик.

Таким образом, один FLG может ссылаться на разные экземпляры модулей в разных сценариях.

Также не нужно создавать экземпляры модуля и настраивать его до построения графика.

+0

Отлично, это имеет большой смысл, спасибо! – Trillian