полноэкранный квад в пиксель имеет координаты экрана?
У меня есть 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 ответ:
Из 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 без буфера вершин?)