像素着色器中的全屏四边形有屏幕坐标?

时间:2012-11-27 22:06:51

标签: directx hlsl

我有一个640x480的rendertarget(它是主要的后备缓冲区)。

我将全屏四边形传递给顶点着色器,全屏四边形的X和Y都有[-1,1]之间的坐标,这意味着我只将坐标传递给像素着色器而不进行计算:

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 <0.5)之类的内容不会工作。

我已经尝试了

  

float x = input.Position.x / input.Position.w;

因为我在某处读到了这种方式,我可以得到-1,1之间的值,但它也不起作用。

提前感谢。

1 个答案:

答案 0 :(得分:4)

来自Semantics - 页面上关于SV_POSITION的MSDN:

  

在像素着色器中使用时,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;
}

(原始来源:Full screen quad without vertex buffer?