C++ HLSL:如何像光栅化器一样将顶点转换为屏幕空间,但具有亚像素精度?
我想使用顶点和像素着色器绘制点列表。每个点的渲染颜色应表示其亚像素精确的屏幕空间坐标(输出到R32G32_FLOAT纹理)。 我在VS中执行以下操作: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
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()