Я только что реализовал отложенный рендеринг / шейдинг в первый раз, и я был удивлен, увидев большой разрыв в производительности между прямым и отложенным рендерингом.
Когда я запускаю свое приложение с прямым рендерингом, я получаю довольно приличную частоту кадров при работе в режиме Release
Однако когда я запустил его с отложенным рендерингом, это дало мне довольно неожиданный результат
Я хорошо знаю, что отложенный рендеринг — это НЕ то, чем вы покрываете приложение, чтобы оно работало «быстрее». Я считаю, что это метод оптимизации производительности, который можно оптимизировать множеством способов, и я понимаю, что этот метод имеет больший объем памяти, чем прямой рендеринг.
Тем не мение…
У меня сейчас есть ОДИН точечный свет в сцене и сто кубов, созданных с помощью аппаратного копирования. Свет движется взад и вперед по оси Z, бросая свет на кубики.
Проблема в том, что свет очень медленный при движении. Это так медленно, что приложение не регистрирует ввод с клавиатуры. Честно говоря, я не был готов к этому, и я предполагаю, что я делаю что-то ужасное в своей реализации.
Пока что я изменил формат текстур на gbuffers с DXGI_FORMAT_R32G32B32A32_FLOAT
в DXGI_FORMAT_R16G16B16A16_FLOAT
Чтобы увидеть, оказал ли он какое-либо визуальное воздействие, но это не так.
Какие-либо предложения? Спасибо!
ПРИМЕЧАНИЕ
Я использую Visual Studio Графика Диагностика для отладки моих приложений DirectX
Решил это!
Я включил DirectX отладочный слой и я получил море предупреждений D3D11
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 1 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 1 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 2 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 2 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 3 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 3 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD]
Таким образом, в конце функции рендеринга, т.е. после
mSwapChain->Present( 0, 0 );
я добавил
mDeviceContext->ClearState();
Просто для сброса контекста устройства, который устанавливает все слоты ввода / вывода ресурсов в NULL
как объяснено на MSDN