Я реализую отложенный рендеринг / затенение в первый раз, когда я столкнулся с некоторыми проблемами, которые мне не удается решить самостоятельно: /.
При рендеринге прохода геометрии и отложенного прохода я получаю этот странный вывод
Я использую зеленый прозрачный цвет в начале своего отложенного прохода перед настройкой топологии, схемы ввода и т. Д. Так вот откуда берется зеленый. Я не уверен, почему выходное изображение делится пополам.
Однако моя главная проблема заключается в успешной передаче целей рендеринга из моего прохода геометрии в виде представлений ресурсов шейдера в мой отложенный шейдер. Это результат моего геометрического шейдера
Итак, судя по выходному изображению, которое я видел, удалось преобразовать в правильное пространство, верно?
В моем проходе геометрии я установил цели рендеринга
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, которое впоследствии можно использовать в качестве входных данных в шейдере.
Не стесняйтесь поправлять меня и / или расширять свой кругозор по этому вопросу.
Любые предложения по моей проблеме? Спасибо!
Я понял, что я делаю не так!
Черно-зеленое разделенное изображение было результатом выборки в отложенном шейдере с неверным 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
так как моя геометрия проходит использовать тесселяцию.