Я выполняю отложенное рендеринг/затенение в первый раз, когда я столкнулся с некоторыми проблемами, с которыми у меня возникает проблема самостоятельно:/,
Отложенное рендеринг: проблемы при передаче целевых объектов визуализации в виде шейдерного ресурса Просмотров до шейдера
При визуализации геометрии прохода и отложенный пропуск вместе я получаю эту Wierd ищет выход
Я использую зеленый ясный цвет в начале моего отсроченного прохода перед установкой топологии, ввод макета и т.д .. Таким образом, вот откуда берется зеленый цвет. Я не уверен, почему выходное изображение разделено пополам.
Моя основная проблема заключается в том, чтобы успешно передать цели рендеринга из моей геометрии в качестве представлений ресурсов шейдера в мой отложенный шейдер. Это результат моего геометрического шейдера
Итак, судя по выходному изображению, которое я видел, чтобы управлять преобразованием в правильное пространство справа?
В моей геометрии перевале я поставил мои цели визуализации
ID3D11RenderTargetView* renderTargetsToSet[] = { mGBuffers[0]->RenderTargetView(),
mGBuffers[1]->RenderTargetView(),
mGBuffers[2]->RenderTargetView(),
mGBuffers[3]->RenderTargetView() };
mDeviceContext->OMSetRenderTargets(NUM_GBUFFERS, renderTargetsToSet, mDepthStencilView);
В отсроченной проходе я поставил их вид шейдера ресурсов
ID3D11ShaderResourceView* viewsToSet[] = { mGBuffers[0]->mShaderResourceView,
mGBuffers[1]->mShaderResourceView,
mGBuffers[2]->mShaderResourceView,
mGBuffers[3]->mShaderResourceView };
mDeviceContext->PSSetShaderResources(0, 4, viewsToSet);
В моем отсроченном шейдере зарегистрировать их
Texture2D worldPosTexture : register(t0);
Texture2D normalTexture : register(t1);
Texture2D diffuseTexture : register(t2);
Texture2D specularTexture : register(t3);
И образцы их
float3 worldPosSample = worldPosTexture.Sample(samplerState, input.texCoord).xyz;
float3 normalSample = normalTexture.Sample(samplerState, input.texCoord).xyz;
float3 diffuseSample = diffuseTexture.Sample(samplerState, input.texCoord).xyz;
float3 specularSample = specularTexture.Sample(samplerState, input.texCoord).xyz;
Чтобы получить точно такой же вывод, что геометрия проход дал я пишу
return float4(worldPosSample, 1.0f);
Но все, что я получаю, что черный и зеленый раскол изображение, которое я отправил. Чтобы отладить это, я поместил некоторые if-утверждения, которые возвращают цвет, если один из элементов в образце float3 был 0.0f и ВСЕ элементов равны 0.0f! Я действительно устанавливаю объекты gbuffer для рендеринга в качестве представлений ресурсов шейдеров правильно?
Мое понимание было то, что когда GBuffer содержит ID3D11ShaderResourceView * и ID3D11RenderTargetView * и ID3D11Texture2D *, используемый для создания как, создается с D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE флаг привязки, который, когда используется целевой вид рендеринга, затем его содержимое автоматически «копируется» в представление ресурсов шейдера gbuffer, которое позже может использоваться как вход в шейдер.
Не стесняйтесь исправлять меня и/или расширять мои горизонты по этому вопросу. Любые предложения по моей проблеме? Спасибо!
данные никогда не копируются в любом месте. Фактические биты - это одна и та же память, вам просто нужно по-разному «просматривать» одни и те же данные. Вы не можете использовать тот же физический буфер, что и вход и выход в том же передаваемом рендере, но вы должны думать о RT и SRV здесь, поскольку оба являются одним и тем же физическим битом памяти. –