依照烘托管线的分类,能够把Sharder分红3个类别:
1、固定功用上色器(Fixed FuncTIon Shader)
固定功用上色器为固定功用烘托管线的详细表现。
2、外表上色器
存在于Unity3D中由U3D发扬光大的一门技能。UnTIy3D为咱们把Shader的复杂性包装起来,下降shader的书写门槛。
3、极点上色器和片段上色器
GPU上含有两个组件:可编程极点处理器和可编程片段处理器,极点和片段处理器被别离成可编程单元,可编程极点处理器是一个硬件单元,能够运转极点程序,而可编程片段处理器则是一个能够运转片段程序的单元。
极点上色器
极点上色程序从GPU前端(寄存器)中提取图元信息(极点方位、法向量、纹路坐标),并完结极点坐标空间改换、法向量空间转化、光照核算等操作,最终将核管用据传送到指定寄存器中。
片段上色器
片段程序从上述寄存器中获取需求的数据:纹路坐标与光照信息等,并依据这些信息以及从应用程序传递的纹路信息进行每个片段的色彩核算(纹路查询),最终将处理后的数据传送光栅操作模块。
三种上色器的共同点:
• 都必须从仅有一个根Shader开端
• ProoerTIes参数部分,作用以及语法完全相同。
• 详细功用都在SubShader里。
• 都能够打标签
• 都能够Fallback
• 都能够处理根本的功用,例如光照漫反射以及镜面反射。但如uv核算作用等高档功用,固定功用上色器无法完结。
三种上色器的不同点
• 外表上色器没有通道pass{},加了会报错,该上色器现已把详细内容打包在光照模型中了。
• 固定烘托管线每句代码之后都没有“;”
• 中心结构不同:
– 固定烘托管线的中心是:
Material{}以及SetTexture[_MainTex]{}
– 极点与片段上色器的中心是:
CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" ENDCG
– 外表上色器的中心是:
1.外表上色器运用Unity3D自带光照模型Lambert,也不做极点处理,只需求一个外表处理函数surf即可。 CGPROGRAM #Pragma surface surf Lambert ENDCF 2.这套表明运用的是自己写的光照模型lsyLightModel,而且运用了极点处理函数vert CGPROGRAM #pragma surface surf lsyLightModel vertex:vert ENDCG
在Unity中怎么区别以上三种上色器
• 没有嵌套CG言语,即代码中没有CGPROGARAM和ENDCG关键字的,便是固定功用上色器。
• 嵌套CG言语,代码中有surf函数的为外表上色器
• 嵌套了CG言语,代码中有#pragma vertex name和 #pragma fragment frag声明的,便是极点上色器&片段上色器。