Отложенный рендеринг: проблемы при передаче целей рендеринга в виде шейдерных ресурсов в шейдер

Я реализую отложенный рендеринг / затенение в первый раз, когда я столкнулся с некоторыми проблемами, которые мне не удается решить самостоятельно: /.

При рендеринге прохода геометрии и отложенного прохода я получаю этот странный вывод введите описание изображения здесь

Я использую зеленый прозрачный цвет в начале своего отложенного прохода перед настройкой топологии, схемы ввода и т. Д. Так вот откуда берется зеленый. Я не уверен, почему выходное изображение делится пополам.

Однако моя главная проблема заключается в успешной передаче целей рендеринга из моего прохода геометрии в виде представлений ресурсов шейдера в мой отложенный шейдер. Это результат моего геометрического шейдера
введите описание изображения здесь

Итак, судя по выходному изображению, которое я видел, удалось преобразовать в правильное пространство, верно?

В моем проходе геометрии я установил цели рендеринга

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 флаг bind, указывающий, что при использовании целевого представления рендеринга его содержимое автоматически «копируется» в представление ресурсов шейдера gbuffer, которое впоследствии можно использовать в качестве входных данных в шейдере.

Не стесняйтесь поправлять меня и / или расширять свой кругозор по этому вопросу.
Любые предложения по моей проблеме? Спасибо!

2

Решение

Я понял, что я делаю не так!

Черно-зеленое разделенное изображение было результатом выборки в отложенном шейдере с неверным UV-координаты. Я сделал ошибку, просто снова передав геометрию и сэмплируя ее координаты текстуры.

Решением было определить очень простой квад и новый буфер вершин, чтобы сохранить его в

vertices[0].position = XMFLOAT3( -1.0f,  1.0f, 0.0f );  vertices[0].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[0].texCoord = XMFLOAT2( 0.0f, 0.0f );
vertices[1].position = XMFLOAT3(  1.0f,  1.0f, 0.0f );  vertices[1].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[1].texCoord = XMFLOAT2( 1.0f, 0.0f );
vertices[2].position = XMFLOAT3( -1.0f, -1.0f, 0.0f );  vertices[2].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[2].texCoord = XMFLOAT2( 0.0f, 1.0f );
vertices[3].position = XMFLOAT3(  1.0f, -1.0f, 0.0f );  vertices[3].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[3].texCoord = XMFLOAT2( 1.0f, 1.0f );

Квадрат имеет свою нормальную точку в отрицательной оси Z, поэтому его ориентация такая же, как текстуры, которые были получены в проходе геометрии. Я также создал новый ID3D11InputLayout* содержащий только POSITION, NORMAL а также TEXCOORD для отложенного прохода, а также изменили топологию на D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP так как моя геометрия проходит использовать тесселяцию.

Это окончательный вывод 🙂
введите описание изображения здесь

0

Другие решения


По вопросам рекламы [email protected]