Я пытаюсь реализовать отложенное затенение в DirectX 11, c++. Мне удалось создать G-буфер и отобразить в нем свою сцену (проверено с помощью «GPU PerfStudio»). У меня возникли трудности с окончательным этапом освещения. Я не могу читать текстуры (Diffuse, Normal, Specular), используя координаты, возвращаемые SV_Position.
Это пиксельный шейдер, используемый для рендеринга света в виде фигур.
Texture2D<float4> Diffuse : register( t0 );
Texture2D<float4> Normal : register( t1 );
Texture2D<float4> Position : register( t2 );
cbuffer MaterialBuffer : register( b1 )
{
float4 ambient;
float4 diffuse;
float4 specular;
}
//--------------------------------------------------------------------------------------
struct VS_OUTPUT
{
float4 Pos : SV_POSITION;
float4 PosVS: POSITION;
float4 Color : COLOR0;
float4 normal : NORMAL;
};
float4 main(VS_OUTPUT input) : SV_TARGET
{
//return Diffuse[screenPosition.xy]+Normal[screenPosition.xy]+Position[screenPosition.xy];
//return float4(1.0f, 1.0f, 1.0f, 1.0f);
//--------------------------------------------------------------------------------------
//Problematic line
float4 b=Diffuse.Load(int3(input.Pos.xy,0));
//--------------------------------------------------------------------------------------
return b;
}
Я проверил с помощью «GPU PerfStudio», правильно ли связаны входные текстуры.
Вышеприведенный код возвращает цвет, который я использовал для очистки текстуры. (Из моей отладки я обнаружил, что его возвращаемое значение в местоположении пикселя 0,0)
Если я заменю проблемную строку на: -
float4 b=Diffuse.Load(int3(350,300,0));
Затем он рендерит значение в 350 300 пикселей с правильной формой света.
Спасибо