2015-07-24 8 views
2


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

При визуализации геометрии прохода и отложенный пропуск вместе я получаю эту Wierd ищет выход enter image description here

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

Моя основная проблема заключается в том, чтобы успешно передать цели рендеринга из моей геометрии в качестве представлений ресурсов шейдера в мой отложенный шейдер. Это результат моего геометрического шейдера enter image description here

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

В моей геометрии перевале я поставил мои цели визуализации

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, которое позже может использоваться как вход в шейдер.

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

+0

данные никогда не копируются в любом месте. Фактические биты - это одна и та же память, вам просто нужно по-разному «просматривать» одни и те же данные. Вы не можете использовать тот же физический буфер, что и вход и выход в том же передаваемом рендере, но вы должны думать о RT и SRV здесь, поскольку оба являются одним и тем же физическим битом памяти. –

ответ

0

Я понял, что я делал неправильно!

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

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

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); 

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

Это конечный результат :) enter image description here