полноэкранный квад в пиксель имеет координаты экрана?


У меня есть 640x480 rendertarget (его основной backbuffer).

Я передаю полноэкранный четырехугольник в вершинный шейдер, полноэкранный четырехугольник имеет координаты между [-1,1] для X и Y, это означает, что я передаю координаты только в пиксельный шейдер без расчета:

struct VSInput
{
    float4 Position : SV_POSITION0;
};

struct VSOutput
{
    float4 Position : SV_POSITION0;
};

VSOutput VS(VSInput input)
{
    VSOutput output = (VSOutput)0;
    output.Position = input.Position;
    return output;
}
Но в пиксельном шейдере координаты x и y для каждого фрагмента находятся в пространстве экрана (0 Но правда в том, что этот пиксельный шейдер работает:
float x = input.Position.x;

if(x < 200)
    output.Diffuse = float4(1.0, 0.0, 0.0, 1.0);
else if( x > 400)
    output.Diffuse = float4(0.0, 0.0, 1.0, 1.0);
else
    output.Diffuse = float4(0.0, 1.0, 0.0, 1.0);

return output;

Он выводит 3 цветные полосы на моем окне рендеринга, но если я изменю значения из пространства экрана (200 и 400 из кода выше) на -1,1 пространства и использую что-то вроде if(x

Я уже пробовал

Float x = вход.Позиция.x / вход.Позиция.w;

Потому что я где-то читал, что таким образом я мог бы получить значения между -1,1, но это тоже не работает.

Заранее благодарю.

1 3

1 ответ:

Из MSDN на семантике - странице о SV_POSITION:

При использовании в шейдере пикселей SV_Position описывает расположение пикселей.

Таким образом, вы видите ожидаемое поведение.

Наилучшим решением является передача координат пространства экрана в качестве дополнительного параметра. Мне нравится использовать этот шейдер вершин "полноэкранный треугольник":

struct VSQuadOut {
    float4 position : SV_Position;
    float2 uv: TexCoord;
};

// outputs a full screen triangle with screen-space coordinates
// input: three empty vertices
VSQuadOut VSQuad( uint vertexID : SV_VertexID ){
    VSQuadOut result;
    result.uv = float2((vertexID << 1) & 2, vertexID & 2);
    result.position = float4(result.uv * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f), 0.0f, 1.0f);
    return result;
}

(исходный код: полноэкранный quad без буфера вершин?)