D3D10 HLSL: как привязать текстуру к глобальному объекту Texture2D с помощью отражения?

Итак, предположим, что где-то в моем шейдере есть следующая инструкция (обратите внимание, я включаю устаревшую поддержку для совместного использования шейдеров между 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").


person Goz    schedule 07.07.2010    source источник
comment
Итак, у вас есть файл DX9 .fx (или просто .vs/.ps?), и вы хотите скомпилировать его и запустить в контексте DX10, используя отражение?   -  person Stringer    schedule 08.07.2010
comment
Хм, теперь я вижу вашу проблему. Но если у вас есть DiffuseSampler, то достаточно знать, что вам нужно привязать к данному слоту SRV диффузной текстуры, нет? Не уверен, нужно ли вам также привязывать состояние сэмплера DX10 с помощью *SetSamplers к тому же слоту.   -  person Stringer    schedule 08.07.2010
comment
Ну, состояние сэмплера определяется в шейдере, поэтому мне не нужно его привязывать. Но опять же, знание сэмплера не обязательно говорит мне, что такое прикрепленная текстура/обзор...   -  person Goz    schedule 08.07.2010
comment
Вы совершенно правы. Если вы не знаете, что DiffuseSampler ведет к DiffuseMap. Но, возможно, это не так.   -  person Stringer    schedule 08.07.2010
comment
У меня не было возможности проверить, но, по словам ребят из группы DirectXDev, это ДЕЙСТВИТЕЛЬНО дает мне доступ к текстуре и сэмплеру. У меня еще не было возможности это проверить. Другая информация, которую я получил, предполагает, что мне нужно будет вручную проанализировать шейдер DX9, чтобы получить эту информацию ... Но, по крайней мере, это означает, что я могу вернуть свою семантику :D   -  person Goz    schedule 09.07.2010
comment
Конечно, вы всегда можете разобрать файл шейдера, если только у вас нет просто больших двоичных объектов...   -  person Stringer    schedule 12.07.2010


Ответы (1)


Хм, позвольте мне перефразировать это. На стороне 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 вызова *SetShaderResources. И pDesc.Name (например, «DiffuseMap») дает вам информацию об ассоциации.

person Stringer    schedule 08.07.2010
comment
Однако GetResourceBindingDesc возвращает мне Sampler, а не Texture2D :( Однако спасибо за подтверждение в части BindPoint. Я догадался, что это так, но не был уверен. Было бы ДЕЙСТВИТЕЛЬНО хорошо, если бы вы могли получить пользовательский семантика (как в файле эффекта). - person Goz; 08.07.2010
comment
Что ж, в DX9 семплеры и текстуры одинаковы, не так ли? Только DX10/11 обеспечивает четкое разделение между семплерами и текстурами (или буферами). - person Stringer; 08.07.2010
comment
Они не то же самое в DX9 AFAIK. Вы можете прикрепить несколько сэмплеров к одной и той же текстуре, если хотите ... Я не вижу причин, по которым вы хотели бы этого, но вы можете это сделать (опять же, насколько я знаю). - person Goz; 08.07.2010
comment
Да, я знаю об этом. Я хотел сказать, что с точки зрения HLSL нет никакой разницы. Вы используете tex2d(mySampler, coord) и все. В SM4.0 и выше у вас есть myTexture.Sample(mySampler, ...). - person Stringer; 08.07.2010
comment
Ааа ... я понимаю, что вы имеете в виду :) - person Goz; 08.07.2010