Чтение и запись текстур в HLSL 5.0 (отложенное затенение)


Я пытаюсь реализовать отложенное затенение в 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 пикселей с правильной формой света.

Спасибо


person Srijan Kumar Sharma    schedule 20.10.2013    source источник
comment
Что в этом случае делает ваш вершинный шейдер? И какую геометрию вы к нему привязываете для световой фазы?   -  person mrvux    schedule 21.10.2013


Ответы (2)


Вы пробовали использовать флаг отладки D3D11_CREATE_DEVICE_DEBUG при создании устройства и смотрели выходной журнал. Вы можете столкнуться с несоответствием подписи между этапами Vertex и Pixel. Это объясняет, почему семантика sv_position ведет себя неправильно.

person galop1n    schedule 20.10.2013
comment
Я уже использую D3D11_CREATE_DEVICE_DEBUG, ошибка несоответствия не отображается. - person Srijan Kumar Sharma; 21.10.2013
comment
Что получится, если вы добавите эту строку в пиксельный шейдер: return float4( Input.Pos.xy / 512.f, 0.f, 1.f );? У вас есть полностью черное изображение или градиент, насыщенный желтым после 512 пикселей? - person galop1n; 21.10.2013

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

Благодарю за ваш ответ.

person Srijan Kumar Sharma    schedule 22.10.2013