Game Development Stack Exchange is a question and answer site for professional and independent game developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

In my HLSL pixel shader, SV_POSITION seems to have different values to any other semantic I use. I don't understand why this is. Can you please explain it?

For example, I am using a triangle with the following coordinates:

(0.0f, 0.5f)
(0.5f, -0.5f)
(-0.5f, -0.5f)

The w and z values are 0 and 1, respectively.

This is the pixel shader.

struct VS_IN
    float4 pos : POSITION;

struct PS_IN
    float4 pos : SV_POSITION;
    float4 k : LOLIMASEMANTIC;

PS_IN VS( VS_IN input )
    PS_IN output = (PS_IN)0;
    output.pos = input.pos;
    output.k = input.pos;
    return output;

float4 PS( PS_IN input ) : SV_Target
    // screenshot 1
    return input.pos;

    // screenshot 2
    return input.k;

technique10 Render
    pass P0
        SetGeometryShader( 0 );
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );

Screenshot 1

Screenshot 2

When I use the first statement (result is first screenshot), the one that uses the SV_POSITION semantic, the result is completely unexpected and is yellow, whereas using any other semantic will produce the expected result. Why is this?

share|improve this question
up vote 7 down vote accepted

SV_Position gives you the position in screen coordinates, not in a [0,1] range though but basically in pixel coordinates. The range will correspond to the D3D11_VIEWPORT you set, possibly something along the lines of:

D3D11_VIEWPORT viewport = {0};
viewport.Width = 1280;
viewport.Height = 720;

So in order to get a [0,1] range again, for the colors, you could do:

return float4(input.pos.r/1280, input.pos.g/720, 0, 1);

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.