2010-07-07 2 views
2

ИТАК предполагая, у меня есть, где-то в моем шейдере заявление следующим образом (Примечание я позволяет унаследованную поддержке обмениваться шейдерами между DX9 и DX10):D3D10 HLSL: Как связать текстуру с глобальным Texture2D через отражение?

Texture2D DiffuseMap; 

Я могу компилировать до шейдер без каких-либо проблем, но Я немного теряю, как привязать ShaderResourceView к «DiffuseMap». Когда я «Отражаю» шейдер, я предпочел бы, что он появится среди переменной в постоянном буфере. Это не так. На самом деле я не могу нигде идентифицировать его. Итак, как мне узнать, что текстура «stage» (использовать термин 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» там).

+0

У вас есть файл DX9 .fx (или просто .vs/.ps?) И хотите скомпилировать его и запустить в контексте DX10 с использованием отражения? – Stringer

+0

Фактически ... да. – Goz

+0

Хм, я вижу твою проблему сейчас. Но если у вас есть «DiffuseSampler», достаточно знать, что вам нужно привязать к данному слоту SRV диффузной текстуры, нет? Не уверен, что вам нужно связать также состояние сэмплера DX10, используя * SetSamplers в том же слоте. – Stringer

ответ

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») дает вам информацию об ассоциации.

+0

GetResourceBindingDesc возвращает мне Sampler, а не Texture2D, однако :(Спасибо за подтверждение в BindPoint. Однако я бы догадался, что это так, но не был уверен. Что было бы ДЕЙСТВИТЕЛЬНО хорошо, если бы вы могли получить доступ к пользовательскому интерфейсу, (например, в файле эффекта). – Goz

+0

Хорошо в DX9. Пробоотборники и текстуры одинаковы, не так ли? Только DX10/11 обеспечивают чистое разделение между пробоотборниками и текстурами (или буферами). – Stringer

+0

Это не то же самое в DX9 AFAIK. У вас может быть несколько пробников, прикрепленных к одной и той же текстуре, если вы этого хотите ... Я не вижу причин, по которым вы захотите, но вы можете это сделать (Опять AFAIK). – Goz

Смежные вопросы