《Unity3D ShaderLab开发实战详解》第2章 Unity中Shader(着色器)的形态

Shader结构

Shader "Tut/NewBie/FirstShader"{
	Properties{
		//[可选的特性]用来控制在编辑器上如何显示,可写可不写。
		//2D纹理,默认值为""、"white"、"back"、"gray"、"bump"、"red"。
		[可选的特性] _MyTex2D("Tex2D Value", 2D) = "white"{}
		
		_MyTex3D("Tex3D Value", 3D) = "white"{}//3D纹理
		_MyCube("Cube Value", Cube) = "white"{}//Cube纹理
		_MyColor("Color Value", Color) = (1,1,1,1)
		_MyVertor("Vector Value", vector) = (1,1,1,1)
		_MyInt("Int Value", int) = 1
		_MyFloat("Float Value", float) = 1
		_MyRange("Range Value", range(0,1) = 1
	}
	SubShader{
		Tags{"Queue"="Background" "RenderType"="Opaque"}
		
		Pass{
			//定义名字(必须大写),可以在其它Pass中用UsePass "路径/Pass名字"引用。
			Name "MYPASS"
			
			[Pass Tags]
			[RenderSetup]
			
			//使用之前要先声明一下。
			sampler2D _MyTex2D;
			sampler3D _MyTex3D;
			samplerCUBE _MyCube;
			
			float4 _MyColor;
			float4 _MyVector;
			
			float _MyFloat;
			float _MyRange;
		}
	}
	SubShader{
		...
	}
	FallBack "Diffuse"
}
  • [可选的特性]:用来控制在编辑器上如何显示,可写可不写。
    • [HideInInspector]:不在编辑器中显示.
    • [NoScaleOffset]:不在编辑器中显示纹理的tiling/offset编辑项。
    • [Normal]:这个纹理是一个法线纹理。
    • [HDR]:这个纹理是一个(HDR) 纹理.
    • [Gamma]:在编辑器界面中将float/vector属性指定为sRGB值。
    • [PerRendererData]:纹理属性将以MaterialPropertyBlock的形式传入着色器。
  • [RenderSetup]:
    • Cull Back | Front | Off
    • ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
    • ZWrite On | Off
    • Offset 因子, 单位(偏移 = m * 因子 + r * 单位)
      • m:多边形的最大深度斜率(z变化 / x变化和y变化中最小的)。
      • r:是个常量(具体依赖特定实现)。
    • Blend :
      • Blend Off:不混合。
      • Blend src dst:(源颜色 * src) + (目标颜色 * dst),值为zero、one、SrcColor、SrcAlpha、DstColor、DstAlpha、OneMinusSrcColor、OneMinusSrcAlpha、OneMinusDstColor、OneMinusSrcAlpha。
      • BlendOp colorOp:colorOp为Add、Min、Max、Sub。
      • BlendOp colorOp, alphaOp
      • AlphaToMask On | Off
    • ColorMask RGB | A | 0 | R, G, B, A的任意组合
  • SubShader Tags:SubShader里的Tags(不是Pass中的Tags)。
    • Queue:渲染顺序,值为Background、Geometry、AlphaTest、Transparent、Overlay、具体数字。
    • RenderType:渲染类型,值为Opaque、Transparent、自定义字符串,经常用于渲染替换。
    • DisableBatching:是否禁用批处理。True、False、LODFading,
    • ForceNoShadowCasting:
    • IgnoreProjector:忽略投影,值为True、False。
    • CanUseSpriteAtlas:
    • PreviewType:编辑器如何显示材质,值为Sphere、Plane、Skybox。
  • Pass Tags:Pass里的Tags。
    • LightMode:灯光模式。
      • Always:
      • ForwardBase:前向渲染,用于环境光、主平行光、球谐光、光照贴图。
      • ForwardAdd:前向渲染,附加的每个像素光照执行一次。
      • Deferred:延迟渲染,渲染到GBuffer中。
      • ShadowCaster:渲染物体深度到深度或者阴影贴图中。
      • MotionVectors:用来计算每个物体的移动向量。
      • PrepassBase:用于老的延迟渲染,渲染法线和高光指数。
      • PrepassFinal:用于老的延迟渲染,渲染最终的颜色,光照和发光。
      • Vertex:顶点光照,如果物体没有光照贴图,将启用所用的顶点光。
      • VertexLMRGBM(已弃用):顶点光照,可以获得unity_Lightmap处理光照贴图(用于PC)。
      • VertexLM:顶点光照,可以获得unity_Lightmap处理光照贴图(用于移动设备)。
    • PassFlags:
    • RequireOptions:
  • FallBack "Diffuse":如果没有找到适合的SubShader,就用“Diffuse”默认是Shader实现。
  • Shader语言:
    • GLSL:在GLSLPROGRAM和ENDGLSL之间写GLSL代码。
    • CG:在CGPROGRAM和ENDCG之间写CG代码。

ShaderLab

  • ShaderLab:如果想写一个支持照明、阴影等功能的Shader,可以直接写Surface Shader,它已经为我们封装好了所有的复杂性。
Shader "Tul/NewBie/SurfShader"{
	SubShader{
		Tags{"RenderType"="Opaque"}
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert
		sampler2D _MainText;
		struct Input{
			float2 uv_MainTex;
		}
		vodi surf(Input IN, inout SurfaceOutput o){
			half4 c = tex2D(_MainTex, IN.uv_MainTex);
			o.Albedo= c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}
struct SurfaceOutput{
	half3 Albedo;
	half3 Normal;
	half3 Emission;
	half Specular;
	half Gloss;
	half Alpha;
}

在C#中向Material传递数据

  • 向Shader的Properties中传递数据:
    • Material.SetTexture("_MyTexture", MyTexture);
    • Material.SetTexture("_MyCube", MyCube);
    • Material.SetColor("_MyColor", MyColor);
    • Material.SetVector("_MyVector", MyVector);
    • Material.SetFloat("_MyFloat", MyFloat);
    • Material.SetFloat("_MyRange", MyRange);
  • 矩阵的传递:
    • 矩阵不能在Properties中定义。
    • 在Shader中定义uniform float4x4 m;
    • 在C#中赋值Material.SetMatrix(“m”, mat);

未完待续…

发布了41 篇原创文章 · 获赞 4 · 访问量 3897

猜你喜欢

转载自blog.csdn.net/weixin_42487874/article/details/103225223