Unity Shaders and Effects Cookbook (5-1)LitSphere lighting model

Posted _Captain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shaders and Effects Cookbook (5-1)LitSphere lighting model相关的知识,希望对你有一定的参考价值。

第四章反射就结束了,接下来继续学习第五章-光照模型。

光照模型我们已经很熟悉了,之前各种漫反射、高光 都自定义过光照模型函数。我以为这一章讲的会是之前说的光照模型函数,然而却不是。

看完第一节,给我的感觉是 这讲的好像是教我 怎么去使用烘培出来的图。就是说讲的是如何用一张静态图片来模拟灯光效果。


这一章用到的静态图片都由 MaCrea 这个免费软件创建。我下载过来了,但是不会用。后面有时间再去学习,现在就先用书本带的图片。

Macrea 下载地址:

http://pan.baidu.com/s/1eSO53SA

首先介绍下,因为这一次是使用贴图来模拟光照的,所以Shader 里面虽然有自定义光照模型函数,但是这个函数对颜色是没有做什么处理的,从Surf 函数中传过来,就直接传出去了。

然后其中用到了空间转换的知识,暂时还没能看懂,等我看懂了再来补上。


好,继续。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

首先创建场景,一个灯光,一个Sphere。 既然上面说了 光照模型函数 没什么实际用处,那还要灯光做什么呢? 这里只是添加一个,弄个影子。才看起来像3D效果。

然后创建材质,创建 Shader。

Shader 代码如下:

Shader "CookbookShaders/Chapter05/LitSphere" 

	Properties 
	
		_MainTint ("Diffuse Tint", Color) = (1,1,1,1)
		_MainTex ("Base (RGB)", 2D) = "white" 
		_NormalMap ("Normal Map", 2D) = "bump" 
	
	
	SubShader
	
		Tags  "RenderType"="Opaque" 
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Unlit vertex:vert

		sampler2D _MainTex;
		sampler2D _NormalMap;
		float4 _MainTint;
		
		inline fixed4 LightingUnlit (SurfaceOutput s, fixed3 lightDir, fixed atten)
		
			fixed4 c = fixed4(1,1,1,1);
			c.rgb = c * s.Albedo;
			c.a = s.Alpha;
			return c;
		

		struct Input 
		
			float2 uv_MainTex;
			float2 uv_NormalMap;
			float3 tan1;
			float3 tan2;
		;
		
        void vert (inout appdata_full v, out Input o) 
        
            UNITY_INITIALIZE_OUTPUT(Input,o);
          
            TANGENT_SPACE_ROTATION;
            o.tan1 = mul(rotation, UNITY_MATRIX_IT_MV[0].xyz);
            o.tan2 = mul(rotation, UNITY_MATRIX_IT_MV[1].xyz);
          
        

		void surf (Input IN, inout SurfaceOutput o) 
		
			float3 normals = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
			o.Normal = normals;

			float2 litSphereUV;
			litSphereUV.x = dot(IN.tan1, o.Normal);
			litSphereUV.y = dot(IN.tan2, o.Normal);
		
			half4 c = tex2D (_MainTex, litSphereUV*0.5+0.5);
			o.Albedo = c.rgb * _MainTint;
			o.Alpha = c.a;
		
		ENDCG
	 
	FallBack "Diffuse"

运行结果



少许解释


#pragma surface surf Unlit vertex:vert

首先 这里指定光照模型函数为 Unlit ,我理解为 UnLight ,就是不受光照影响的意思。事实上 这个材质的确是不受光照影响的。

然后 第一次遇到 vertex:vert 这种。这是指定 顶点函数。下面就对应有一个 vert 顶点函数。之前在学习OpenGL的时候呢,是有VertexShader 和 FragmentShader。所以我猜这里应该也有 frag 片段函数吧。



inline fixed4 LightingUnlit (SurfaceOutput s, fixed3 lightDir, fixed atten)

	fixed4 c = fixed4(1,1,1,1);
	c.rgb = c * s.Albedo;
	c.a = s.Alpha;
	return c;
在 Unlit 光照模型函数中,不做处理,不接受光照。


void vert(inout appdata_full v,out Input o)

	UNITY_INITIALIZE_OUTPUT(Input,o);

	TANGENT_SPACE_ROTATION;

	o.tan1=mul(rotation,UNITY_MATRIX_IT_MV[0].xyz);
	o.tan2=mul(rotation,UNITY_MATRIX_IT_MV[1].xyz);

在顶点函数中,为了正确的检索球面贴图,我们需要把正切旋转矩阵 rotation 乘以当前模型的逆转置模型视图,这样才能得到正确的向量,并将其用于我们的球面贴图。

我现在也还没理解这里的意思,后面再来补上。




项目打包下载:

http://pan.baidu.com/s/1skRWC0l


以上是关于Unity Shaders and Effects Cookbook (5-1)LitSphere lighting model的主要内容,如果未能解决你的问题,请参考以下文章

Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器

Unity Shaders and Effects Cookbook (6-1) 使用 alpha 参数的 半透明着色器

Unity Shaders and Effects Cookbook (6-3) 修改渲染队列Queue 来 修改渲染顺序

Unity Shaders and Effects Cookbook (7-3) 在地形中使用顶点颜色做混合

Unity Shaders and Effects Cookbook (D-2) Cull Back背面剔除 -- 模型半边不可见

Unity Shaders and Effects Cookbook (5-1)LitSphere lighting model