2014-12-05 107 views
0

我想使用Direct3D 11将几个图像从多视图混合到一个纹理中,因此我在顶点着色器阶段和几何着色器阶段进行多次投影,其中一个投影结果存储在SV_Position中,其他存储在POSITION0,POSITION1中等等。这些位置将用于采样图像。光栅化器阶段发生了什么?

然后在像素着色器阶段,SV_Position中的值典型地类似于(307.5,87.5),因为它在屏幕空间中。因为渲染目标的大小是500x500,所以样本的uv是(0.615,0.0.175),这是正确的。但POSITION0中的值将会像(0.1312,0.370),它会与偏移垂直反转。我必须做(0.5 + x,0.5 - y)。投影扭曲并且刚好大致匹配。

光栅阶段在SV_Position上做什么?

回答

1

光栅阶段期望SV_Position中的坐标为标准化的设备坐标。在此空间中,-1.0+1.0之间的X和Y值覆盖了整个输出目标,并且Y向上“移动”。这样你就不必关心着色器中确切的输出分辨率。

因此,当你意识到,在像素被写入目标之前,会执行另一个转换。一个反转Y轴,缩放X和Y并将原点移动到左上角。

在Direct3D11中,可以通过ID3D11DeviceContext::RSSetViewports方法控制此转换的参数。

如果您在像素着色器中需要像素坐标,则必须自己进行转换。例如,为了访问着色器中的输出分辨率,将它们作为着色器常量进行绑定。

+0

那么,投影变换后的坐标是否为NDC?什么观点转换似乎就像'(0.5 + x,0.5 - y)' – Clones1201 2014-12-06 10:20:36

+0

预计位置除以它的w,然后成为NDC,它的工作,Thx! – Clones1201 2014-12-07 01:10:25

+0

是的,对不起。我忘了提到'SV_Position'实际上可以在视角分隔之前超出'[-1,1]'范围之外。 – Lucius 2014-12-07 13:54:26