着色器语言的语义SV_POSITION和POSITION之辨析

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com

简单地说POSITION语意用于顶点着色器,用来指定这些个位置坐标值,是在变换前的顶点的object space坐标。SV_POSITION语意则用于像素着色器,用来标识经过顶点着色器变换之后的顶点坐标。

SV是Systems Value的简写。在SV_Position的情况下,如果它是绑定在一个从VS输出的数据结构上的话,意味着这个输出的数据结构包含了最终的转换过的,将用于光栅器的顶点坐标。或者,如果你将这个标志绑定到一个输入给PS的数据数据的话,它会包含一个基于屏幕空间的像素的坐标。所有的这些SV语义都在DirectX SDK文档中有描述。

vertex shader将会输出顶点的坐标到裁剪空间中,并且这些坐标是使用齐次坐标系的。一般地,这些基于裁剪空间的齐次坐标,是通过对输入的对象空间坐标位置乘以一个WVP矩阵而得到的。然后在光栅器中,这些齐次坐标将会进行透视除法,即对这些坐标的每个分量除以w,做完透视除法后,这些坐标值将会限定在一个左下角是-1,右上角是1的视口范围中。然后做完“把Y坐标翻转,把取值范围从[-1,1]限制到[0,1],接着xy方向分别乘以视口的宽高”的视口变换之后,你便获得了“以SV_Position为标识的,传递给PS的,取值范围是[0,视口高宽],视口左上角为坐标原点的”像素位置坐标。

从D3D10开始出现的SV_Position语意,提供了类似于在Direct3D9对应的Shader Model3.0版本中的VPOS语意。在SM3.0中增加的VPOS语意,是特意用来表示某个像素点的坐标为屏幕空间坐标的。在D3D10及更高的版本中,SV_Position语意同样指定了某个像素点的坐标为屏幕空间坐标。但与VPOS不同的是,指定了SV_Position语意的屏幕空间坐标,光栅器已经自动地对这个值做了0.5像素的偏移,也就是说这个坐标对应的是该像素的中心点而不是左上角。