C++ HLSL:如何像光栅化器一样将顶点转换为屏幕空间,但具有亚像素精度?

C++ HLSL:如何像光栅化器一样将顶点转换为屏幕空间,但具有亚像素精度?,c++,hlsl,direct3d11,rasterizing,C++,Hlsl,Direct3d11,Rasterizing,我想使用顶点和像素着色器绘制点列表。每个点的渲染颜色应表示其亚像素精确的屏幕空间坐标(输出到R32G32_FLOAT纹理)。 我在VS中执行以下操作: struct VSOutput { float4 position : SV_Position; float2 screenSpacePosition : COLOR; }; VSOutput VS(uint index : SV_VertexID) { float3 pointPos = inPointPosition

我想使用顶点和像素着色器绘制点列表。每个点的渲染颜色应表示其亚像素精确的屏幕空间坐标(输出到R32G32_FLOAT纹理)。 我在VS中执行以下操作:

struct VSOutput
{
    float4 position : SV_Position;
    float2 screenSpacePosition : COLOR;
};

VSOutput VS(uint index : SV_VertexID)
{
    float3 pointPos = inPointPositions[index];
    VSOutput output;
    output.position = mul(transform, float4(pointPos, 1));
    output.screenSpacePosition = (float2(+1, -1) * output.position.xy / output.position.w * 0.5f + 0.5f) * float2(width, height);
    return output;
}
在我的PS中,我通常只使用screenSpacePosition字段作为我的最终目标颜色,但由于我遇到了一些问题,我将其更改为验证计算的screenSpacePosition与用于光栅化的实际像素位置一致(以调试问题)。如果计算的screenSpacePosition与光栅化位置匹配,则输出白色,否则输出红色

float4 PS(VSOutput input) : SV_Target
{
    return all(floor(output.screenSpacePosition) == floor(input.position.xy)) ? float4(1, 1, 1, 1) : float4(1, 0, 0, 1);
}
现在所有的像素都是白色的,这是意料之中的,但顶部偶尔会有红色噪音。我强烈认为这是因为光栅化器使用内部16.8定点格式映射到实际像素,因此该定点格式和我的浮点变换之间的映射不完全一致。 有没有办法解决这个问题?

使用
ceil()
而不是
floor()

考虑点光栅化规则,

假设VS输出的屏幕空间位置恰好位于整数像素坐标
(n,m)
,则以
(n-0.5,m-0.5)
为中心的像素将被光栅化,并接收PS中的SV_位置
(n-0.5,m-0.5)
,而传递给PS的手动计算的位置仍然是
(n,m)
,应用
floor()