我有一个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 但事实是,这个像素着色器有效: 它在我的渲染窗口输出3个彩色条纹,但如果我将屏幕空间(上面的代码中的200和400)的值更改为-1,1空格并使用if(x <0.5)之类的内容不会工作。 我已经尝试了 float x = input.Position.x / input.Position.w; 因为我在某处读到了这种方式,我可以得到-1,1之间的值,但它也不起作用。 提前感谢。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;
答案 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;
}