一.简介
固定功能shader(Fixed function shader):针对硬件能够执行的基本命令编写的shader.
二.编写简单的Shader
1.pass通道
在Unity中创建一个Surface Shader:
打开Shader,删去Properties和SubShader中的内容,并添加pass通道代码:
Shader "Custom/First" { SubShader { //使用pass编写渲染通道 pass { color(1,0,0,1)//红色 } } }
可以看到,使用color指定了shader渲染的颜色为红色.在Unity中创建一个材质,并将此shader指定给这个材质,然后在游戏中创建一个物体使用此材质,就可以看到相应的效果:
2.使用参数
Shader "Custom/First" { properties{ //指定参数_Color,其名称为"Main Color",类型为颜色color,默认值为(0,1,0,1) _Color("Main Color",color) = (0,1,0,1)//默认绿色 } SubShader { pass { //当前颜色渲染使用_Color参数赋值 color[_Color] } } }
在Properties中添加参数(不区分大小写),指定参数的格式和使用参数的方式见代码,指定后在Unity中选中材质所在的游戏物体可以看到这个名为Main Color的参数:
可以直接修改参数的值(和MonoBehavIoUr脚本的参数类似).
3.光照信息
Shader "Custom/First" { properties{ //指定参数_Color,其名称为"Main Color",类型为颜色color,默认值为(0,1,0,1) _Color("Main Color",color) = (0,1,0,1)//默认绿色 //环境光参数 _Ambient("Ambient",color) = (0.7,0.7,0.7,1) //高光参数 _specular("specular",color) = (1,1,1,1) //高光反射区域参数 _Shininess("Shininess",range(0,8)) = 4 //自发光参数 _Emission("Emission",color) = (1,1,1,1) } SubShader { pass { //在材质命令块中编写光照信息 Material{ //默认光照颜色 diffuse[_Color] //环境光信息 ambient[_Ambient] //高光信息 specular[_specular] //高光反射区域信息 shininess[_Shininess] //自发光信息 emission[_Emission] } //使用lighting on/off开关光照 lighting on //独立的镜面高光开启 separatespecular on } } }
4.setTexture命令
Shader "Custom/First" { properties{ //指定参数_Color,其名称为"Main Color",类型为颜色color,默认值为(0,1,0,1) _Color("Main Color",color) = (0,1,0,1)//默认绿色 //环境光参数 _Ambient("Ambient",color) = (0.7,0.7,0.7,1) //高光参数 _specular("specular",color) = (1,1,1,1) //高光反射区域参数 _Shininess("Shininess",range(0,8)) = 4 //自发光参数 _Emission("Emission",color) = (1,1,1,1) //纹理参数,值为给纹理取得名字 _MainTex("MainTex",2d) = "" } SubShader { //标签控制渲染顺序 Tags{"Queue" = "Transparent"} pass { //在通道前加入blend factor Blend SrcAlpha OneMinusSrcAlpha //在材质命令块中编写光照信息 Material{ //默认光照颜色 diffuse[_Color] //环境光信息 ambient[_Ambient] //高光信息 specular[_specular] //高光反射区域信息 shininess[_Shininess] //自发光信息 emission[_Emission] } //使用lighting on/off开关光照 lighting on //独立的镜面高光开启 separatespecular on //设置纹理,一个settexture只能编写一张纹理 settexture[_MainTex] { //结合纹理(texture代表纹理,primary代表光照高光等信息,double用于提高亮度) combine texture * primary double } //混合第二张纹理贴图 settexture[_MainTex] { //结合纹理(prevIoUs代表之前已经混合的纹理) combine texture * prevIoUs double,texture * constant } } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。