每次写片元着色器的时候都会忘记写“SV_TARGENT”,归根到底还是基本功不扎实,没有明白底层原理,现在就来总结归纳一下
1、语义绑定
首先要明白的是两者的属性,这两个都是语义绑定(semantics binding)。什么是语义绑定呢?语义绑定可以理解为关键字,我们都知道图形渲染是按照一步一步地进行的,又叫做渲染管线。那么为什么是要一步一步地进行呢?因为GPU的架构与CPU非常不同,cpu更像是人的大脑,可以同时思考不同的问题,而GPU则相当于计算机,通过有特定的输入,通过计算得到最终的输出。GPU没有像CPU一样的堆栈来存取变量与值,所以通过语义绑定将一个计算好的值放在一个物理存储位置,再用的话就利用语义绑定去特定物理位置取出,这也是GPU不能像CPU一样工作的原因之一吧。
有兴趣的同学可以去看一些关于GPU架构的基础的知识,对理解Shader底层有很大的帮助
2、工作流程
SV_前缀的变量代表system value的意思,在DX10+的语义绑定中被使用代表特殊的意义,SV_POSITION在用法上和POSITION是一样的,区别是 SV_POSTION一旦被作为vertex函数的输出语义,那么这个最终的顶点位置就被固定了,不得改变。DX10+推荐使用SV_POSITION作为vertex函数的输出和fragment函数的输入,而vertex函数的输入还是使用POSITION。也就是说推荐你在片元着色器前完成对顶点的位置转换(注意不是说在顶点着色器完成全部的顶点位置转换,有些着色器中会在几何着色器和细分着色器中对顶点进行进一步的处理)。不过DX10以后的代码依旧兼容POSITION作为全程表达,估计编译器会自动判断并替换的吧。
SV_Target是DX10+用于fragment函数着色器颜色输出的语义。DX9使用COLOR作为fragment函数输出语义,但是也有一些着色器语言使用COLOR来表示网格数据和顶点输出语义,效果和功能是一样的,没有什么区别,同时使用COLOR的话DX10+也会兼容。
附一张手写的流程图
![fed6393ff2e00263a150ee263d16ee0d.png](https://img-blog.csdnimg.cn/img_convert/fed6393ff2e00263a150ee263d16ee0d.png)
个人理解是顶点信息被取出经过处理后放回,或者说一直都是在那个物理位置进行计算,SV_POSTION指出了那个位置(模型顶点信息存放的物理位置),片元着色器则将返回的颜色值通过SV_TARGET放入GPU中模型颜色信息存放的物理位置
图中的流程为个人理解,存在缺漏希望大家指出,共同学习!
参考链接:
SV_POSITION与SV_Targetwww.jianshu.com![c2fccf99ce53b4b431228a5f9e8ecc2c.png](https://img-blog.csdnimg.cn/img_convert/c2fccf99ce53b4b431228a5f9e8ecc2c.png)