PowerVR平台的流控制——着色器优化
demi 在 周三, 11/06/2019 - 09:39 提交
今天我们要介绍的是新的文档网站中又一个知识点:着色器中的流控制和分支,这个系列涵盖了从mipmapping到GPU负载均衡等一系列话题,我们很高兴大家能一直喜欢这些内容,从流量统计数据来看大家都会花一定的时间来浏览这个网站,这看起来太棒了。
今天我们要介绍的是新的文档网站中又一个知识点:着色器中的流控制和分支,这个系列涵盖了从mipmapping到GPU负载均衡等一系列话题,我们很高兴大家能一直喜欢这些内容,从流量统计数据来看大家都会花一定的时间来浏览这个网站,这看起来太棒了。
着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。在最简配置下,至少都得有两个着色器:一个叫顶点着色器(vertex shader),它将作用于每个顶点上;另一个叫片段着色器(fragment shader),它将作用于每一个采样点。我们采用4倍抗锯齿,因此每个像素有四个采样点。
着色器的写法类似C语言,可以定义变量、常量以及函数,有main方法,在Opengl ES渲染过程中,会不断调用其main方法来进行计算,我们不去大篇幅讨论着色器语法、API等,会通过实际的例子让大家真正知道着色器中变量的含义、以及对变量进行定位和其赋值等。
在可编程管线中,我们能够编码的就是Vertex Shader(顶点着色器) 和 Fragment Shader(片元着色器),这也是渲染过程中,必备的2个着色器。
光照用来表示材质和光源之间的相互作用。光照可以和颜色,纹理,以及透明度等一起使用,共同形成屏幕上的视觉外观效果。主要存在三种类型的着色处理方法:扁平、Gouraud、Phong。这3种方法分别基于多边形,顶点,像素来计算光照效果。
常用的几个内置文件通常都被封装在cginc文件中,通过文件的包含来实现对文件中函数及变量的引用,大家可以到unity的安装目录下找到对应的文件,当然我们也可以写一些自己的cginc文件放置到该目录中,方便自己使用。
unity会把 CGINCLUDE 和 ENDCG 之间的代码插入到每一个pass中,已达到声明一遍,多次使用的目的。例如,可以在 CGINCLUDE 和 ENDCG 之间 定义多个 顶点和片段方法,在pass里只要写明 #pragma vertex 顶点方法名 #pragma fragment 片段方法名 即可,而不用写具体的函数实现。