在场景照片中新建一个3D物体,可以看到物体上都会有Mesh Filter 和 Mesh Render,首先要明白这几个是什么意思
Mesh:模型的网格,模型由三角面构成,一个模型中三角形的点面集合就是Mesh
Mesh由顶点坐标数组、顶点在uv坐标系中的位置信息数组,三角形顶点顺时针或者逆时针索引数组、MeshFiler组件MeshRender组件、可能还需要每个顶点的法线的数组等组成
Mesh Filter:存储一个Mesh,用于增加mesh属性
Mesh Render:增加材质并渲染出来
Shader可以被看做为一种渲染命令,由Directx或者OpenGL进行解析,来控制渲染图形
OpenGL使用GLSL语言。Directx使用HLSL,还有英伟达的CG,unity使用ShaderLab(对CG的封装)进行Shader编写
Unity Shader的分类:
顶点片元着色器
表面着色器(对顶点片元的封装)
固定函数着色器
创建一个Shader,赋给一个胶囊体并打开,删除所有的代码,开始编写我们的第一个Shader
Shader "Custom/Shader01"//这里指定shader的路径和名字,不要求与文件名保持一致 { Properties//属性块,只有一个,在外界进行调节 { //属性名("显示在Inspector面板属性的名字",属性的类型)=(R,G,B,A) _Color ("Color", Color) = (1,1,1,1) } SubShader { /*用来控制效果,可以有很多个,显卡运行效果时发现实现不了会自动运行下一个SubShader 增加Shader的适应能力*/ Pass{ //Pass块相当于一个方法 CGPROGRAM //在这里使用CG编写Shader代码 ENDCG } } /*如果SubShader中的都无法使用,则使用这个*/ FallBack "Diffuse" }
这时我们并没有使用CG编写效果,场景中胶囊体的效果则为FallBack中的效果(左图),如果我们注释掉就会出现(右图)的情况(没有任何的效果)
Shader中Properties的类型:
//颜色 _Color("Color",Color)=(1,1,1,1) //四维向量 xyzw _Vector("Vector",Vector)=(1,2,3,4) _Int("Int",Int) = 5 _Float("Float",Float) = 4.5 //范围值,对Float进行一个限制 _Range("Range",Range(1,11)) = 6 //图片,white为未指定图片时图片的默认颜色 _2D("Texture",2D) = "white"{} _3D("Texture",3D) = "white"{} _Cube("Cube",Cube)= "white"{}
在在编写需要将上面属性中的变量再次使用SubShader中的类型进行定义:
Shader "Custom/Shader01" { Properties { _Color("Color",Color)=(1,1,1,1) //四维向量 xyzw _Vector("Vector",Vector)=(1,2,3,4) _Int("Int",Int) = 5 _Float("Float",Float) = 4.5 //范围值,对Float进行一个限制 _Range("Range",Range(1,11)) = 6 //图片,white为未指定图片时图片的默认颜色 _2D("Texture",2D) = "white"{} _Cube("Cube",Cube)= "white"{} _3D("Texture",3D) = "white"{} } SubShader { Pass { CGPROGRAM /*在编写需要将上面属性中的变量再次使用SubShader中的类型进行定义 值会默认为上面所设定的值*/ float4 _Color; float4 _Vector; float _Int; float _Float; float _Range; sampler2D _2D; samplerCube _Cube; sampler3D _3D; ENDCG } } FALLBACK "Diffuse" }
float、half、fixed的区别:
float可以用half或者fixed来进行代替,代表不同的精度 float 32位,half 16位 -6万-6万 ,fixed 11位 -2到2 ,如颜色可以用fixed而不用float,节约显存