三言两语说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。
前几天刷刷看了几个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。
相关文章推荐
- Python如何模拟发送form-data请求
- 神庙逃亡
- 算法训练 字串统计
- 算法训练 字符删除
- c++面试题
- 随谈 error:unknown filesystem grub rescue解决办法
- [从头学数学] 第157节 概率初步 小结与复习题
- springMVC整合xStream
- 算法训练 反置数
- Android相对布局属性全解
- Linux内核分析之六——进程的描述与进程的创建
- ZOJ 1151 Word Reversal
- 算法训练 数位分离
- C++智能指针与返回局部指针测试
- 算法训练 薪水计算
- 超简单小算法求圆面积(测多组数据及小用一下正则表达式)(入门)
- 算法训练 整除问题
- springMVC4(5)RestTemplate控制层单元测试
- 快速排序
- 快速排序