Unity Shaders and Effects Cookbook

https://blog.csdn.net/candycat1992/article/details/17097907   【Unity Shaders】概述及Diffuse Shading介绍】

https://blog.csdn.net/candycat1992/article/details/39994049   初探Surface Shader背后的机制

第一章 漫反射

1.5 自定义漫反射

如果 你想在着色器代码里通过变量名来获得它的属性值,则必须创建与之对应的另一个变量。
 #pragma surface   告诉编辑器使用哪个光照模型计算。

三种格式的光照模型函数:命名 Lighting+任何名字

● half4 LightingName (SurfaceOutput s, half3 lightDir, half atten){} 该函数用于不需要视角方向的前向着色。

● half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten){} 该函数用于需要视角方向的前向着色。

● half4 LightingName_PrePass (SurfaceOutput s, half4 light){} 该函数用于需要使用延迟着色的项目

扫描二维码关注公众号,回复: 6782586 查看本文章

1.6 创建 Half Lambert 光照模型

Half Lambert  : 用于在低光照区域照亮 物体的技术。它基本上提高了材质和物体表面周围的漫反射光照。用来防止某个物体的背光面 丢失形状并且显得太过平面化。没有物理原理,只是为了视觉增强。

左:半兰伯特模型  右:普通漫反射

Half Lambert 技术实现的原理:

    把漫反射光照值的范围分成两半,然后加上0.5。基本 意思就是如果光照值是1,对半开后就是 0.5,然后再加 0.5 回去,将会再得到 1。如果你对 0 进行操作,那么你会得到 0.5,因此我们将 0 ~ 1 之间的所有值重新映射到区间 0.5 ~ 1。 

1.7 创建渐变纹理来控制漫反射着色

—使用渐变纹理(ramp texture)来控 制漫反射光照的颜色。这允许你突出表面的颜色,来模拟更多的反射光照或者其他高级的 灯光设置.想要突出艺术画面,不需要真实物理模拟时使用。

tex2D 函数有两个参数,第一个参数是我们使用的纹理,第二个参数包含的是映射纹理的 UV 坐标。 ,tex2D 函数会去搜索(0,0)UV坐标处的纹理像素。

1.8 使用 2D 渐变纹理创建假的 BRDF

由光照函数BRDF【双向反射分布函数】提供的视角方向,观察方向指的是我们看向物体自身的方向。它是一个标注了方向的向量,这意味着我们可以将它和法线以及光照方向结合起来使用。这种视点向量可以为我们提供一种更先进 的纹理索引技术。 

【双向反射分布函数】可以简单理解为入射光在不透明物体表面同时反射到观察方向 (观察者眼睛方向)和出射光两个方向。

当使用观察方向参数时,我们可以创建一个简单的衰减渲染效果。你可以使用这个参 数来制作任何不同类型的效果:一个透明的泡泡、边缘高光效果、盾牌效果,甚至可以制 作卡通边缘线效果。

使用纹理贴图制作特效

PC上都是按照最高精度float来计算,而在移动平台。fixed在比较旧的移动平台用,大多数都是把half和fixed当成同精度来处理。

注意: shader中的语法错误,定位行是40行,其错误可能在39行引起的下一行错误。

插值:

lerp(a,b,f)=(1-f )* a + b * f  ;

f的取值范围是【0-1】。当f=1时,直接放回b, 当f=0时返回a , f=0.5时,返回(a+b)平均数。

返回的这个数是一个定值,应用时需要把上一次插值的结果作为下一次插值的a.

//transform.position = Vector3.Lerp(transform.position, end, 0.5f);
//Debug.Log(transform.position + "   " + start + "      " + end);

2.4 压缩和混合纹理贴图

  原理是:利用插值从一个纹理图片插值到另一个纹理插值,使用第三张贴图的r来作为影响参数。

2.5  法线贴图

   用途: 它是用来在不增加额外多边形的情况下 添加更多的细节。该技术的一个常见用途是通过一个高多边形模型或高度图形成法线贴图, 这样就显著地提高了低多边形模型的表现效果以及细节。 

UnpackNormals() 函数(法线解压函数)来使用法线贴图

2.6  创建程序纹理贴图
   概念:需要动态创建纹理或者在运行时修改它们的像素 值,这种情况通常被称为程序性的纹理效果。

   创建流程: 需要在一个二维空间中创建一组像素然后将其应用到一个新的纹理上。再将创建 的新纹理传入到着色器中,使它们可以在着色器中进行计算。

   应用:使用动态创建纹理贴图的 方式可以制造一种玩家和游戏环境之间的互动效果。也可以用它来制作一些贴花的效果, 或者创建一些可以在着色器函数中使用的程序化形状等。

2.7 Photoshop 色阶效果

色阶是表示图像亮度强弱的指数标准。

实现原理:


Shader "Custom/ColorStage" {
	Properties {
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_inBlack("Input Black",Range(0,255)) = 0
		_inGamma("Input Gamma",Range(0,2)) = 1.61
		_inWhite("Input White",Range(0,255)) = 255
		_outWhite("Out White",Range(0,255)) = 255
		_outBlack("Out Black",Range(0,255)) = 0

	}
		SubShader{
			Tags { "RenderType" = "Opaque" }
			LOD 200

			CGPROGRAM
#pragma surface surf Lambert

		float _inBlack;
		float _inGamma;
		float _inWhite;
		float _outWhite;
		float _outBlack;

		float outRPixel;  //存储红色通道

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		float GetPixelLevel(float pixelColor)
		{
			float pixelResult;
			// 因为tex2D() 函数所提供的颜色值范围是从0 到 1,所以我们需要将其重新映射至 0.0 到 255.0 的范围内
			pixelResult = (pixelColor * 255.0);
			//. 然后减去我们的输入值_inBlack,这样当我们将输入色阶的黑色滑块朝着255.0 滑动 时可以使所有像素变得更暗。
			pixelResult = max(0, pixelResult - _inBlack);
			//然后,当我们将输入色阶的白色滑块朝着0.0 滑动时,可以将所有像素变得更亮,并 对得到的结果求 _inGamma 次方
			pixelResult = saturate(pow(pixelResult / (_inWhite - _inBlack), _inGamma));
			// 最后,我们将新的像素值与_outWhite 减去_outBlack 的差相乘,然后将新的像素值 重新映射到 0.0 ~ 1.0 的范围内:
			//我们使用_outWhite 和 _outBlack 再次修改像素值,这样你就可以对最小像素值 以及最大像素值有一个最终的全局控制了。
			pixelResult = (pixelResult * (_outWhite - _outBlack) + _outBlack) / 255.0;
			return pixelResult;
		}

		void surf (Input IN, inout SurfaceOutput o)
		{
			half4 c = tex2D(_MainTex, IN.uv_MainTex);

			float outRPixel = GetPixelLevel(c.r);
			float outGPixel = GetPixelLevel(c.g);
			float outBPixel = GetPixelLevel(c.b);

			o.Albedo = float3(outRPixel, outGPixel, outBPixel);
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

第 3 章 利用镜面反射让游戏闪耀起来

UnityCG.cginc 文件有Lambert 和 BlinnPhong 两种光照模型可以使用。

 #pragma surface surf BlinnPhong 编译着色器 的时候,你就会告诉着色器使用UnityCG.cginc 文件中的BlinnPhong 光照函数。

#pragma surface surf Lambert.... 实现前边已经说过了。

3.3 创建Phong高光模型:

高光着色器:

告诉编辑器我们创建一个自定义的视点相关性着色器。注意和申明的语句一致。

猜你喜欢

转载自blog.csdn.net/qq_35433081/article/details/90513569
今日推荐