1、语义绑定
首先要明白的是两者的属性,这两个都是**语义绑定**(semantics binding)。什么是语义绑定呢?语义绑定可以理解为关键字,我们都知道图形渲染是按照一步一步地进行的,又叫做渲染管线。那么为什么是要一步一步地进行呢?因为GPU的架构与CPU非常不同,cpu更像是人的大脑,可以同时思考不同的问题,而GPU则相当于计算机,通过有特定的输入,通过计算得到最终的输出。GPU没有像CPU一样的堆栈来存取变量与值,所以通过语义绑定将一个计算好的值放在一个物理存储位置,再用的话就利用语义绑定去特定物理位置取出,这也是GPU不能像CPU一样工作的原因之一吧。
2、工作流程
SV_前缀的变量代表system value的意思,在DX10+的语义绑定中被使用代表特殊的意义,SV_POSITION在用法上和POSITION是一样的,区别是 SV_POSTION一旦被作为vertex函数的输出语义,那么这个最终的顶点位置就被固定了,不得改变。DX10+推荐使用SV_POSITION作为vertex函数的输出和fragment函数的输入,而vertex函数的输入还是使用POSITION。也就是说推荐你在片元着色器前完成对顶点的位置转换(_**注意不是说在顶点着色器完成全部的顶点位置转换,有些着色器中会在几何着色器和细分着色器中对顶点进行进一步的处理**_)。不过DX10以后的代码依旧兼容POSITION作为全程表达,估计编译器会自动判断并替换的吧。
3、总结
SV_前缀的变量代表system value。SV_TARGET与SV_POSITION都属于语义绑定,GPU通过语义绑定将计算好的值放在物理存储位置后在使用时利用语义绑定去取出。**SV_Target是DX10+用于fragment函数着色器颜色输出的语义。DX9使用COLOR作为fragment函数输出语义,但是也有一些着色器语言使用COLOR来表示网格数据和顶点输出语义,效果和功能是一样的,没有什么区别,同时使用COLOR的话DX10+也会兼容。**