Unity Shader------入门

在场景照片中新建一个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,节约显存

发布了107 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/103744052