Unity Shader 学习笔记(五) Surface Shaders

Suface Shaders

个人理解 SufaceShader 就是unity已经把光照系统,纹理系统等渲染需要组合需要的特性的基于vertex frament shader编写的shader,是方便开发者更好的看到unity渲染的效果。

缺点:性能比较差,移动平台不建议使用,灵活性比较差。

有点:可以快速展示效果,还可以查看源码方便学习

https://docs.unity3d.com/Manual/SL-SurfaceShaders.html 官方文档

SufaceOutput  是Suface输出参数的结构体 目前有两种结构体,

struct SurfaceOutputStandard
{
    fixed3 Albedo;      // base (diffuse or specular) color 漫反射颜色 
    fixed3 Normal;      // tangent space normal, if written//切线空间法线  
    half3 Emission; // 自发光
    half Metallic;      // 0=non-metal, 1=metal 金属度;取0为非金属, 取1为金属  
    half Smoothness;    // 0=rough, 1=smooth 光泽度;取0为非常粗糙, 取1为非常光滑  
    half Occlusion;     // occlusion (default 1) 遮挡(默认值为1)  
    fixed Alpha;        // alpha for transparencies透明度
};

Input 输入信息,是指从模型FBX信息内获取的信息传递给output 

  • float3 viewDir 视图方向( view direction)值。为了计算视差效果(Parallax effects),边缘光照(rim lighting)等,需要包含视图方向( view direction)值。
  • float4 with COLOR semantic每个顶点(per-vertex)颜色的插值。
  • float4 screenPos 屏幕空间中的位置。 为了反射效果,需要包含屏幕空间中的位置信息。比如在Dark Unity中所使用的 WetStreet着色器。
  • float3 worldPos 世界空间中的位置。
  • float3 worldRefl 世界空间中的反射向量。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。 请参考这个例子:Reflect-Diffuse 着色器。
  • float3 worldNormal 世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。
  • float3 worldRefl; INTERNAL_DATA 世界空间中的反射向量。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。为了获得基于每个顶点法线贴图( per-pixel normal map)的反射向量(reflection vector)需要使用世界反射向量(WorldReflectionVector (IN, o.Normal))。请参考这个例子: Reflect-Bumped着色器。
  • float3 worldNormal; INTERNAL_DATA 世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。为了获得基于每个顶点法线贴图( per-pixel normal map)的法线向量(normal vector)需要使用世界法线向量(WorldNormalVector (IN, o.Normal))。

下面看下shader代码

 直接看SubShader 所有需要理解的都写到注释里了

      

Shader "Custom/SufaceShader_1" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)//颜色值
		_MainTex ("Albedo (RGB)", 2D) = "white" {}//纹理贴图
		_Glossiness ("Smoothness", Range(0,1)) = 0.5//浮点值,用于计算高光范围
		_Metallic ("Metallic", Range(0,1)) = 0.0//浮点值,用于计算表现的金属光泽
	}
	SubShader {
		Tags { "RenderType"="Opaque" "Queue"="Transparent" }//渲染类型 = 不透明
		LOD 200//是渲染等级标示
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		//pragma 编译指令告诉下面由什么配置来渲染
		//suface 告诉系统 要用suface渲染
		//surf  surface shader来编写渲染 surf是一哥自定义的函数 用于给渲染属性赋值,例如赋值材质,颜色
		//lightModel Standard 第二个参数是 光照类型Standard 标准的光照类型还有很多 (Standard 光照模式的源码在unity安装目录里Data\CGIncludes\UintyPBSLighting内)当然也可以自定义光照计算函数命名前面要带Lighting
		//fullforwardshadows 最后一个是个多选参数 当前写的是个阴影类型 
		//这个指令具体还要看下 unity自带的官方文档 https://docs.unity3d.com/Manual/SL-SurfaceShaders.html
		#pragma surface surf Standard fullforwardshadows decal:blend

		// Use shader model 3.0 target, to get nicer looking lighting
		//target是要告诉系统用哪个渲染模型来渲染,就是一个shader的渲染版本,越高效果相对越好。目前都使用3.0了,如果设备不支持会默认降级
		#pragma target 3.0
		
		//CG判断语言内如果要使用Properties内的属性字段,必须在下面定义同名的修饰符的属性 方可使用
		//注意 类型不是类型不是对应的
		sampler2D _MainTex;
		half _Glossiness;
		half _Metallic;
		fixed4 _Color;

		//这是一个结构体,用于描述UV 纹理的坐标
		struct Input {
			float2 uv_MainTex;//uv表示这是这是个UV数值 MainTex表示上定义的贴图,这句话表示从模型内获取MainTex对应的UV的贴图坐标
		};
		 


		// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
		// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
		// #pragma instancing_options assumeuniformscaling
		UNITY_INSTANCING_CBUFFER_START(Props)
			// put more per-instance properties here
		UNITY_INSTANCING_CBUFFER_END
		//Input 一个定义好类型 用于输入
		//inpout 用于输出 需要用现有参数给inout值赋值,等到最后渲染
		//SufaceOutputStandard 是一个渲染需要的结构体 Surface专用,还有很多在文档里有写
		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;//tex2D 需要用贴图和UV需要贴图哪个区域的颜色值 取值,*_Color是获得和这个颜色的插值
			o.Albedo = c.rgb;//赋值基础颜色
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;//设置金属表面反光系数
			o.Smoothness = _Glossiness;//设置高光系数
			o.Alpha =c.a;//设置透明度
		}
		ENDCG
	}
	FallBack "Diffuse"//如果某一种特性不能使用 就会使用默认Diffuse Shader
}

欢迎加入 前端移动开发交流群 339033019

猜你喜欢

转载自blog.csdn.net/qq_18709863/article/details/84364888