ID3DX11EffectShaderResourceVariable :: SetResource (NULL) не может отсоединить ресурсы - PullRequest
0 голосов
/ 24 октября 2018

Проблема возникла, когда я попытался выполнить упражнение 4 в главе 12 «Введение в программирование трехмерных игр с помощью DirectX 11.» В своем коде я попытался привязать SRV текстуры к Texture2D в .fx * 1003.* кодПосле этого я использовал:

Effects::BasicFX->SetDiffuseMap(NULL);

, чтобы развязать ресурс, но, похоже, он не справился с работой.Я должен был добавить:

ID3D11ShaderResourceView* srvs[] = { NULL };
dc->PSSetShaderResources(0, 1, srvs);

или вывод отладки продолжал предупреждать меня следующим образом:

D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 0 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 0 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]

Эта ситуация также произошла, когда я работал с Compute Shader.Мне пришлось использовать:

ID3D11UnorderedAccessView* uavs[] = { NULL };
UINT initCounts[] = { -1 };
dc->CSSetUnorderedAccessViews(0, 1, uavs, initCounts);

ID3D11ShaderResourceView* srvs[] = { NULL };
dc->CSSetShaderResources(0, 1, srvs);

, чтобы отменить привязку Texture2D и RWTexture2D в моем коде шейдера вместо того, чтобы просто использовать ID3DX11EffectShaderResourceVariable::SetResource(NULL) и ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessView(NULL).

Может кто-нибудь сказать, чтоможет быть не так с моим кодом или подтвердить эту проблему?

1 Ответ

0 голосов
/ 24 октября 2018

SetDiffuseMap не является методом Effects 11, поэтому я не знаю, что он делает, но я собираюсь предположить, что в какой-то момент он вызывает SetResource.

Effects 11 нене изменяйте ничего на устройстве до тех пор, пока вы не вызовете Apply, поэтому вызов метода set не приведет к изменению какой-либо привязки на устройстве.

Эффекты 11 по своему дизайну лениво изменяют состояние для производительности, поэтому вслучаи этих предупреждений об опасности, явно отменяющие привязку, как вы делаете, на самом деле являются правильным решением.

Обязательно используйте последнюю версию Effects 11, которая размещена на GitHub и NuGet .Копия, которая пришла с книгой Фрэнка, довольно старая.Некоторые заметки о различиях см. В wiki и проекте Readme.

Обратите внимание, что хотя эта книга все еще весьма полезна и актуальна, в ней активно используются библиотеки поддержки изустаревший DirectX SDK.Вы можете и должны избегать использования устаревшего DirectX SDK для Direct3D 11 или более поздней версии.См. этот блог , MSDN и Жизнь без D3DX

...