D3D10 HLSL: Как связать текстуру с глобальным Texture2D с помощью отражения? - PullRequest
2 голосов
/ 08 июля 2010

Хорошо, если предположить, что где-то в моем шейдере есть следующее утверждение (обратите внимание, я включаю поддержку прежних версий для обмена шейдерами между DX9 и DX10):

Texture2D   DiffuseMap;

Я могу скомпилировать шейдер с помощьюникаких проблем, но я немного растерялся, связывая ShaderResourceView с «DiffuseMap».Когда я «Отражаю» шейдер, я предполагал, что он окажется среди переменных в постоянном буфере.Это не так.На самом деле я нигде не могу это идентифицировать.Итак, как мне узнать, какую «стадию» текстуры (чтобы использовать термин DX9), которую я должен также связать с ShaderResourceView?

Редактировать: я обнаружил, что могу определить имя сэмплера с помощью «GetResourceBindingDesc».Я не уверен, что это мне вообще помогает, хотя: (

Edit2: Точно так же я не заметил, что то же самое относится и к DX9 ... т.е. я могу получить только сэмплер.

Edit3: Мои Texture2D и Sampler выглядят так:

Texture2D DiffuseMap  : DiffuseTexture;
sampler   DiffuseSampler  = sampler_state
{
    Texture   = (DiffuseMap);
    MinFilter = Linear;
    MaxFilter = Linear;
};

Теперь в работе с рамкой эффекта я могу получить Texture2D с помощью семантической "DiffuseTexture". Затем я могу установить ResourceView (D3D10) / Texture(D3D9) для Texture2D. Увы, похоже, нет никакого способа справиться с «семантикой» с помощью стандартных шейдеров (было бы здорово узнать, как это делает D3D, но изучение структуры эффектов D3D11 пока не привело меня ни к чему.Кажется, он читает его из двоичных, то есть скомпилированных данных, и я сам вижу только «DiffuseSampler»).

1 Ответ

1 голос
/ 08 июля 2010

Хм, позвольте мне перефразировать это.На стороне C ++ у вас есть куча загруженных текстур и связанных SRV.Теперь вы хотите установить шейдер (который приходит из DX9) и, не глядя на то, как пишется шейдер, связать SRV (диффузный в диффузный слот, зеркальное отображение, карты нормалей - вы называете это).Правильно?

Тогда я думаю, что, как вы сказали, лучше всего использовать GetResourceBindingDesc:

HRESULT GetResourceBindingDesc(
  [in]  UINT ResourceIndex,
  [in]  D3D10_SHADER_INPUT_BIND_DESC *pDesc
);

Я думаю, что вам нужно повторять каждый ResourceIndex (начиная с 0, затем 1, 2и т.д.), если HRESULT равно S_OK, то у вас есть pDesc.BindPoint, который будет представлять позицию связанного SRV в массиве ppShaderResourceViews вызова *SetShaderResourcespDesc.Name (например, «DiffuseMap») предоставляет вам информацию об ассоциации.

...