您的位置:首页 > 其它

三言两语说shader(四)渲染流水线及相关

2016-04-02 09:29 232 查看
对一件事物的理解,分真懂和假懂,以及似懂非懂,往往前面走快了,中途就要停下来想一想,不然后面就越来越慢,搞技术,大抵如此了。

前几天刷刷看了几个shader,产生一些疑问,比如一个shader完全没有properties可不可以?那些所谓的“语义”到底有什么用?顶点shader的参数从哪里传过来的?等等。

都是些基本东西,不过越基本越重要啦。

所以今天继续讲原理。

先贴两个链接:

解读Unity中的CG编写Shader系列2——shader的输入输出参数

解读Unity中的CG编写Shader系列5——理论知识

这个作者基本把我要说的都讲得比较清楚了,不过我还是要作个提要,并补充一些。

首先我先忽视几个概念:Tessellation、Geometry Shader、Compute Shader,这几个玩意作为后出现的事物可以暂时先放在主干知识点之外,作为中级内容有时间再研究。

传统的流程大体还是:

1.原始数据准备

2.顶点shader

3.裁剪剔除、插值(我不喜欢“光栅化”这个术语,其实就是在顶点间给像素插值嘛)

4.像素shader

5.最终数据输出

所以,顶点shader的参数,unity自然会给你传过来,不过一定要用约定的语义来接收。

顶点shader输出到像素shader的参数,关键是一个位置信息,语义必须是POSITION或者SV_POSITION,至于其他的参数,随便写啦,照顾到老的显卡,我们会沿用一些约定俗成的语义,如TEXCOORD0、COLOR0等。

我一开始很傻比的试着改了改POSITION语义,发现出错,原因很简单,两个shader形式上写在同一份文件里,实际上执行还是分隔在两个不连续的步骤中,顶点shader的结果是要传递回unity做裁剪插值完了再交给像素shader的,当然要约定好语义啦。

像素shader最终关键是要输出这个像素点的颜色,所以语义自然也有龟腚,叫SV_TARGET,用COLOR也行,但其他的就不行了。

Unity的官方文档Shader Semantics讲得很清楚了,定要好好看看

顶点shader里主要做各种位置变换,具体的流程及相应ShaderLab内置矩阵我就不赘述了,本地转世界、世界转摄像机都简单,第三步Projection投射最终的结果到底是已经在屏幕上了?还是某个仍需处理的中间值,我搞得也并不确切,这个以后有需要再细讲,我想迟早也是绕不过去的。

最后,Properties只是附加参数,没有任何Properties,当然也是可以凭空计算生成最终每个像素的颜色结果的,所以一个shader文件可以没有Properties。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: