我想使用Direct3D 11将多视图中的多个图像混合到一个纹理中,因此我在Vertex Shader阶段和Geometry Shader阶段进行多次投影,其中一个投影结果存储在SV_Position中,其他存储在POSITION0,POSITION1等中。这些位置将用于对图像进行采样。
然后在Pixel着色器阶段,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做了什么?
答案 0 :(得分:1)
光栅化器阶段期望SV_Position
中的坐标为规范化设备坐标。在此空间中,-1.0
和+1.0
之间的X和Y值覆盖整个输出目标,Y“向上”。这样您就不必关心着色器中的确切输出分辨率。
因此,当您意识到,在将像素写入目标之前,将执行另一次转换。一个反转Y轴,缩放X和Y并将原点移动到左上角。
在Direct3D11中,可以通过ID3D11DeviceContext::RSSetViewports
方法控制此转换的参数。
如果您需要像素着色器中的像素坐标,则必须自己进行转换。例如,要在着色器中访问输出分辨率,请将它们绑定为着色器常量。