2016-01-11 11:03:12 meichen8050753 阅读数 7106

Unity5 里面, 当场景里的物体保存成Prefab之后,LightMap的信息就会丢失。Fuck。。

所以最后就写了个脚本,把每个Render里的lightmap纪录下来,当prefab实例化之后,重新设置。

上代码。。


相关设置:



注意事项:检查下是否勾选了 Static -> BatchingStatic ,如果勾选了,一定要去除勾选 !!!!!!

using UnityEngine;  
using System.Collections;  
using System.Collections.Generic;
using UnityEngine.Rendering;

public class PrefabLightmapData : MonoBehaviour {

	//LightMap信息
	[System.Serializable]  
	public struct RendererInfo  
	{  
		public Renderer     renderer;  
		public int          lightmapIndex;  
		public Vector4      lightmapOffsetScale;  
	}

	//场景中的Fog信息
	[System.Serializable]  
	public struct FogInfo  
	{  
		public bool         fog;  
		public FogMode      fogMode;  
		public Color        fogColor;
		public float        fogStartDistance;
		public float        fogEndDistance;
		public float 		fogDensity;
	}


	public FogInfo fogInfo;
	public List<RendererInfo> m_RendererInfo; 
	public List<Texture2D> lightmapNear;
	public List<Texture2D> lightmapFar;
	public LightmapData[] lightmapData;
	public LightmapsMode lightmapsMode;

	//地形的LightMap信息
	public Terrain terrain;
	public RendererInfo terrainRendererInfo;

	//设置光照信息
	[ContextMenu("SetUp")]
	public void SetUp(){  
		lightmapData = new LightmapData[lightmapNear.Count > lightmapFar.Count ? lightmapNear.Count : lightmapFar.Count];
		for(int i = 0; i < lightmapData.Length; i ++){
			lightmapData[i]=new LightmapData();
			lightmapData[i].lightmapFar = i < lightmapFar.Count ? lightmapFar[i] : null;
			lightmapData[i].lightmapNear = i < lightmapNear.Count ? lightmapNear[i] : null;
		}
		LightmapSettings.lightmapsMode = lightmapsMode;
		LightmapSettings.lightmaps=lightmapData;
		LoadLightmap();
		RenderSettings.fog = fogInfo.fog;
		RenderSettings.fogMode = fogInfo.fogMode;
		RenderSettings.fogColor = fogInfo.fogColor;
		RenderSettings.fogStartDistance = fogInfo.fogStartDistance;
		RenderSettings.fogEndDistance = fogInfo.fogEndDistance;
		RenderSettings.fogDensity = fogInfo.fogDensity;
	}

	//保存光照信息
	[ContextMenu("SaveData")]
	public void SaveData(){  
		SaveLightmap ();
	}
	
	public void SaveLightmap()
	{  
		fogInfo = new FogInfo ();
		fogInfo.fog = RenderSettings.fog;
		fogInfo.fogMode = RenderSettings.fogMode;
		fogInfo.fogColor = RenderSettings.fogColor;
		fogInfo.fogStartDistance = RenderSettings.fogStartDistance;
		fogInfo.fogEndDistance = RenderSettings.fogEndDistance;

		lightmapNear = new List<Texture2D>();
		lightmapFar = new List<Texture2D>();
		for(int i = 0; i < LightmapSettings.lightmaps.Length; i ++){
			LightmapData data = LightmapSettings.lightmaps[i];
			if(data.lightmapNear != null){
				lightmapNear.Add(data.lightmapNear);
			}

			if(data.lightmapFar != null){
				lightmapFar.Add(data.lightmapFar);
			}
		}
		m_RendererInfo = new List<RendererInfo> ();
		var renderers = GetComponentsInChildren<MeshRenderer>();  
		foreach (MeshRenderer r in renderers) {  
			if (r.lightmapIndex != -1) {  
				RendererInfo info = new RendererInfo();  
				info.renderer = r;  
				info.lightmapOffsetScale = r.lightmapScaleOffset;  
				info.lightmapIndex = r.lightmapIndex;  
				m_RendererInfo.Add(info);  
			}  
		}

		terrain = GetComponentInChildren<Terrain> ();
		if (terrain != null) {
			terrainRendererInfo = new RendererInfo();
			terrainRendererInfo.lightmapOffsetScale = terrain.lightmapScaleOffset;  
			terrainRendererInfo.lightmapIndex = terrain.lightmapIndex;  
		}
		lightmapsMode = LightmapSettings.lightmapsMode;
	}  
	
	public void LoadLightmap()  
	{  
		if (m_RendererInfo.Count <= 0) return;  

		if (terrain != null) {
			terrain.lightmapScaleOffset = terrainRendererInfo.lightmapOffsetScale;
			terrain.lightmapIndex = terrainRendererInfo.lightmapIndex;
		}

		foreach (var item in m_RendererInfo) {  
			item.renderer.lightmapIndex = item.lightmapIndex;  
			item.renderer.lightmapScaleOffset = item.lightmapOffsetScale;  
		}  
	}
}

当场景中LightMap烘培好了之后,在perfab根节点上面挂上这个脚本,右键-》SaveData,之后apply prefab。

在运行时场景初始化完成之后。调用SetUp方法,即可挂载lightMap。


重点!!我遇上个问题,需要保持原来存在的渲染场景,assetbundle才的LightMap能正常。否则就不会有LightMap,希望谁来个提示。

如果把原来渲染lightmap的场景删了,那么在手机上就会加载不到。
我估摸着是因为assetbundle的时候,没有把lightmap的贴图打包进去,只保存了引用的关系。
所以如果场景删了,那么lightmap的贴图也丢了。

如有疑问,请回复哦~~



2016-01-26 13:44:30 lyf8068353 阅读数 308

Unity3d中BlinnPhong光照模型

本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:

  • Markdown和扩展Markdown简洁的语法
  • 代码块高亮
  • 图片链接和图片上传
  • LaTex数学公式
  • UML序列图和流程图
  • 离线写博客
  • 导入导出Markdown文件
  • 丰富的快捷键

快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目 价格
Computer $1600
Phone $12
Pipe $1

可以使用冒号来定义对齐方式:

项目 价格 数量
Computer 1600 元 5
Phone 12 元 12
Pipe 1 元 234

定义列表

Markdown Extra 定义列表语法:
项目1
项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

Shader "zff/test"
{
    Properties
    {
        //主色调,用于定义物体的基色
        _Color("Main Color",Color)=(1,1,1,1)
        //高光颜色,如果使用BlinnPhong光照模型,则定义高光必须命名_SpecColor,并且,只有变量定义,在surface shader中看不到是哪里使用的,使用改变量的地方隐藏了
        _SpecColor("SpecColor Color",Color)=(0.5,0.5,0.5,1)
        //材质的光泽度,反映无题表面的光泽程序,又叫高光直树,定义范围(0,1]之间,其值越大,反射光越几种
        _Shininess("Shininess",Range(0.01,1)=0.078125
        //主纹理,用于定义物体基色
        _MainTex("Base (RGB) Gloss(A)",2D) = "white"{}
    }
    SubShader
    {
        //绘制类型,只是用于Replaced Shaders的标记,并不是必须的
        //如果需要定义对象的绘制顺序,请使用Queue标记
        Tags{"RenderType"="Opaque"}
        LOD 300
        CGPROGMA
        //定义着色器类型为surface,着色器入口为surf,光照模型为BlinnPhong
        #pragma surface surf BlinnPhong
        sampler2D _Maintex;
        fixed4 _Color;
        half _Shininess;
        struct Input
        {
            //Unity3D中Shader的默认规则,纹理定义前面加uv前缀表示是对应的纹理坐标
            float2 uv_MainTex;
        };
        void surf(Input IN,inout SurfaceOutput o)
        {
            //取主纹理当前对应像素点的值
            fixed4 tex = tex2D(_MainTex,IN.uv_MainTex);
            // Albedo反照率,即物体反射光的数量与外来光数量的比值
            // Albedo = 主纹理 * 主色调,反映了物体的基色,与任何光相关的信息(比如diffuse,shiness等)无关
            output.Albedo = tex.rgb * _Color.rgb;
            //Gloss光滑度[0,1],用于控制反射的模糊程度,值越大,高光反射越清晰,反之越模糊
            //光滑度的"滑"是面的概念,代表无题整体的光滑程度
            // 比如说,同样一块金属,其反射就会慢慢变弱,可以通过Gloss值控制
            //实际上它是针对高光计算的附加系数
            output.Gloss = tex.a;
            //Alpha,不透明度[0,1]:Alpha=0,代表物体完全透明:Alpha=1,表明物体完全不透明
            output.Alpha = tex.a*_Color.a;
            //Shininess光泽度[0,1],又叫高光指数或者镜面反射指数,注意,它在SurfaceOutput结构中的命名(Specular)很容易让人误解它是高光强度,其实不然,它是高光指数
            output.Specular = _Shinness;
        ENDCG
    }
    //如果当前GPU不支持shader,默认使用VertexList
    //Fallback "Diffuse"
    Fallback "VertexList"
}

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为:Γ(n)=(n1)!nN 
  • 块级公式:

x=b±b 2 4ac − − − − − − −   2a  

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.0张三张三李四李四嘿,小四儿, 写博客了没?李四愣了一下,说:忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.0开始我的操作确认?结束yesno
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 这里是 脚注内容.
2018-06-02 09:40:55 qq_38643064 阅读数 635

Unity3D是一个跨平台的游戏引擎,它提供了3d游戏的大部分基础功能实现,比如物理碰撞、3d模型显示、光照等功能,简化了使用者开发游戏的过程,更能够节省非常多的成本,unity3d与别的游戏引擎最大的不同是,它的代码是跨平台的,也就是说,别的引擎一款游戏要写好几份代码,它上面只需写一份就能在所有系统上运行。

unity是使用javascript 与c#进行游戏开发的,javascript 和c#都可以作为实现unity3d的脚本语言,但是关于那个脚本语言更适合来开发unity3d呢,js适合个人开发,C#适用于公司开发。U3D官方团队基于数据分析做出结论,U3D团队会把支持的重心转移到C#,也就是说文档和示例以及社区支持的重心都在C#,C#的文档会是最完善的,C#的代码实例会是最详细的,社区内用C#讨论的人数会是最多的。所以,选择C#开发是最适合的。

对于学习unity3d,首先要掌握c#语言,然后才能按照路线开始正式学习

1、Unity3D程序开发基础
1)C#语法基础
2)OOP(面向对象)
3)网络通信
4)内存管理
从基础讲解C#语言,熟悉字段、属性、接口、委托、事件,掌握C#面向对象编程的核心思想。让学员掌握Unity3d各个方面的知识和基本使用方法,为后面深入的学习打下良好基础。
2、Unity3D高级阶段
1)Unity3D物体系统高级部分
2)Untiy3D动画系统高级部分
3)常规设计模式
4)动画,跟随等相关插件学习
5)第1,3人称项目讲解
在原来的学习基础上,深入学习Unity3D物体系统、动画系统的高级部分,例如骨骼的绑定,动画角色的创建等。配合游戏案例进行深度讲解,让学生充分了解动画的制作过程。
3、游戏跨平台发布
1)IOS版发布
2)安卓版发布
3)网页版发布
4)PC版发布

2019-07-26 20:30:10 qq_43057783 阅读数 39

《Unity Shader 入门精要读书笔记–初级篇–第六章》


光照理论与光照模型

详细的光照理论和光照模型在我另一篇文章中有比较详细的阐释,这里就不再赘述。
详见:3D游戏与计算机图形学中的数学方法读书笔记–第七章–光照部分

在这里我做几点简要补充:

  • 光源与物体表面相交只会有两个结果:散射吸收。散射到物体内部的现象被称为折射散射,而散射到物体外部的现象称为反射;其余部分则被吸收。散射不改变光线密度和颜色,只会改变方向;而吸收不改变方向,只会改变密度和颜色。

  • 计算机图形学第一定律:如果它看起来是对的,那么它就是对的。

  • 漫反射兰伯特定律计算如下:cdiffuse=(clightmdiffuse)max(0,n^l^)c_{diffuse}=(c_{light}\cdot m_{diffuse})max(0,\hat n\cdot \hat l )

  • 高光反射计算

    • Phong模型:r^=2(n^l^)n^l^\hat r=2(\hat n\cdot \hat l)\hat n-\hat l
      cspecular=(clightmspecular)max(0,v^r^)mglassc_{specular}=(c_{light}\cdot m_{specular})max(0,\hat v\cdot \hat r)^{m_{glass}}
    • Blinn-Phong模型:h^=v^+l^v^+l^\hat h=\frac {\hat v+\hat l}{|\hat v+\hat l|}
      cspecular=(clightmspecular)max(0,n^h^)mglassc_{specular}=(c_{light}\cdot m_{specular})max(0,\hat n\cdot \hat h)^{m_{glass}}

相关案例与详细代码

  • 漫反射案例

    • 逐顶点漫反射光照
    	Shader "Unity Shaders Book/Chapter 6/Diffuse Vertex-Level"{
    	Properties{
    		_Diffuse("Diffuse",color) = (1,1,1,1)
    	}
    	SubShader{
    		Pass{
    			Tags{"LightMode" = "ForwardBase"}//设置前向渲染
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			#include "Lighting.cginc"
    			fixed4 _Diffuse;
    			struct a2v{
    				float4 vertex:POSITION;
    				float3 normal:NORMAL;
    			};
    			struct v2f{
    				float4 pos:SV_POSITION;
    				fixed3 color:COLOR;
    			};
    
    			v2f vert(a2v v){
    				v2f o;
    				o.pos=UnityObjectToClipPos(v.vertex);
    				fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
    				fixed3 worldNormal=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
    				fixed3 worldLight=normalize(_WorldSpaceLightPos0.xyz);
    				fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLight));
    				o.color=ambient+diffuse;
    				return o;
    			}
    
    			fixed4 frag(v2f i):SV_Target{
    				return fixed4(i.color,1.0);
    			}
    
    			ENDCG
    		}
    	}
    	Fallback "Diffuse"
    }
    • 逐像素漫反射光照
    Shader "Unity Shaders Book/Chapter 6/Diffuse Pixel-Level"{
    	Properties{
    		_Diffuse("Diffuse",color) = (1,1,1,1)
    	}
    	SubShader{
    		Pass{
    			Tags{"LightMode" = "ForwardBase"}
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			#include "Lighting.cginc"
    			fixed4 _Diffuse;
    			struct a2v{
    				float4 vertex:POSITION;
    				float3 normal:NORMAL;
    			};
    			struct v2f{
    				float4 pos:SV_POSITION;
    				fixed3 worldNormal:TEXCOORD0;
    			};
    
    			v2f vert(a2v v){
    				v2f o;
                    			o.pos=UnityObjectToClipPos(v.vertex);
                   			o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);
    				return o;
    			}
    
    			fixed4 frag(v2f i):SV_Target{
    				fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                    		fixed3 worldNormal=normalize(i.worldNormal);
                    		fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                    		fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLightDir));
                    		fixed3 color=ambient+diffuse;
                    		return fixed4(color,1.0);
    			}
    
    			ENDCG
    		}
    	}
    
    	Fallback "Diffuse"
    }
    • 半兰伯特光照模型(通过改变点积结果范围,使背光面也可以有一定变化)
    	Shader "Unity Shaders Book/Chapter 6/Diffuse Half_Lambert"{
    	Properties{
    		_Diffuse("Diffuse",color) = (1,1,1,1)
    	}
    	SubShader{
    		Pass{
    			Tags{"LightMode" = "ForwardBase"}
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			#include "Lighting.cginc"
    			fixed4 _Diffuse;
    			struct a2v{
    				float4 vertex:POSITION;
    				float3 normal:NORMAL;
    			};
    			struct v2f{
    				float4 pos:SV_POSITION;
    				fixed3 worldNormal:TEXCOORD0;
    				};
    
    			v2f vert(a2v v){
    				v2f o;
                    		o.pos=UnityObjectToClipPos(v.vertex);
                    		o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);
    				return o;
    			}
    
    			fixed4 frag(v2f i):SV_Target{
    				fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                       		fixed3 worldNormal=normalize(i.worldNormal);
                       		fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                        		fixed halfLambert=dot(worldLightDir,worldNormal)*0.5+0.5;
                        		fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*halfLambert;
                        		fixed3 color=ambient+diffuse;
                        		return fixed4(color,1.0);
    				}
    
    				ENDCG
    			}
    		}
    	
    	Fallback "Diffuse"
    }
    • 以上三个shader的效果如下:在这里插入图片描述
      在这里插入图片描述
  • 高光反射案例

    • 逐顶点高光反射
    	Shader "Unity Shaders Book/Chapter 6/Specular Vertex-Level"{
        	Properties{
            	_Diffuse("Diffuse",Color)=(1,1,1,1)
            	_Specular("Specular",Color)=(1,1,1,1)
            	_Gloss("Gloss",Range(8.0,256))=20
        	}
        	SubShader{
            	pass{
                	Tags{"LightMode"="ForwardBase"}
                	CGPROGRAM
    
                	#pragma vertex vert
                	#pragma fragment frag
                	#include "Lighting.cginc"
    
                	fixed4 _Diffuse;
                	fixed4 _Specular;
                	float _Gloss;
    
                	struct a2v{
                    	float4 vertex:POSITION;
                    	float3 normal:NORMAL;
                	};
    
                	struct v2f{
                    	float4 pos:SV_POSITION;
                    	fixed3 color:COLOR;
                	};
    
                	v2f vert(a2v v){
                    	v2f o;
                    	o.pos=UnityObjectToClipPos(v.vertex);
                    	fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                    	fixed3 worldNormal=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                    	fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                    	fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLightDir));
    
                    	fixed3 reflectDir=normalize(reflect(-worldLightDir,worldNormal));
                    	fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz-mul(unity_ObjectToWorld,v.vertex).xyz);
                    	fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir,viewDir)),_Gloss);
    
                    	o.color=ambient+diffuse+specular;
                    	return o;
                	}
    
                	fixed4 frag(v2f i):SV_TARGET{
                    	return fixed4(i.color,1.0);
                	}
    
                	ENDCG
            	}	
        	}
        	Fallback "Specular"
    }
    • 逐像素高光反射
    Shader "Unity Shaders Book/Chapter 6/Specular Pixel-Level"{
        Properties{
            _Diffuse("Diffuse",Color)=(1,1,1,1)
            _Specular("Specular",Color)=(1,1,1,1)
            _Gloss("Gloss",Range(8.0,256))=20
        }
        SubShader{
            pass{
                Tags{"LightMode"="ForwardBase"}
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "Lighting.cginc"
    
                fixed4 _Diffuse;
                fixed4 _Specular;
                float _Gloss;
    
                struct a2v{
                    float4 vertex:POSITION;
                    float3 normal:NORMAL;
                };
    
                struct v2f{
                    float4 pos:SV_POSITION;
                    float3 worldNormal:TEXCOORD0;
                    float3 worldPos:TEXCOORD1;
                };
    
                v2f vert(a2v v){
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);//pos is the type of float4 while worldPos is float3,so worldPos have the extra .xyz 
                    o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);
                    o.worldPos=mul(v.vertex,(float3x3)unity_WorldToObject).xyz;
                    return o;
                }
    
                fixed4 frag(v2f i):SV_TARGET{
                    fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                    fixed3 worldNormal=normalize(i.worldNormal);
                    fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                    fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldLightDir,worldNormal));
                    
                    fixed3 reflectDir=normalize(reflect(-worldLightDir,worldNormal));
                    fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz-i.worldPos.xyz);
                    fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir,viewDir)),_Gloss);
    
                    return fixed4(ambient+diffuse+specular,1.0);
    
                }
    
                ENDCG
            }
        }
        Fallback "Specular"
    }
    • Blinn-Phong光照模型
    Shader "Unity Shaders Book/Chapter 6/Specular BlinnPhong"{
        Properties{
            _Diffuse("Diffuse",Color)=(1,1,1,1)
            _Specular("Specular",Color)=(1,1,1,1)
            _Gloss("Gloss",Range(8.0,256))=20
        }
        SubShader{
            pass{
                Tags{"LightMode"="ForwardBase"}
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "Lighting.cginc"
    
                fixed4 _Diffuse;
                fixed4 _Specular;
                float _Gloss;
    
                struct a2v{
                    float4 vertex:POSITION;
                    float3 normal:NORMAL;
                };
    
                struct v2f{
                    float4 pos:SV_POSITION;
                    float3 worldNormal:TEXCOORD0;
                    float3 worldPos:TEXCOORD1;
                };
    
                v2f vert(a2v v){
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);//pos is the type of float4 while worldPos is float3,so worldPos have the extra .xyz 
                    o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);
                    o.worldPos=mul(v.vertex,(float3x3)unity_WorldToObject).xyz;
                    return o;
                }
    
                fixed4 frag(v2f i):SV_TARGET{
                    fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                    fixed3 worldNormal=normalize(i.worldNormal);
                    fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);
                    fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldLightDir,worldNormal));
                    
                    fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz-i.worldPos.xyz);
                    fixed3 newDir=normalize(viewDir+worldLightDir);
                    fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(saturate(dot(newDir,worldNormal)),_Gloss);
    
                    return fixed4(ambient+diffuse+specular,1.0);
    
                }
    
                ENDCG
            }
        }
        Fallback "Specular"
    }
    • 则上述三个shader效果如下:
      在这里插入图片描述
      在这里插入图片描述
Unity3D
2019-05-29 21:00:00 mqs515 阅读数 28
                                  Unity3D

预设体
概念:为了减少频繁的创建对象,或者在其他场景应用某一个对象,我们可以采用预设体。
好处:1、操作简单,使用方便
2、容易维护,方便修改
修改预设体的注意事项:
1、修改完预设体之后一定要记得Apply(应用)
2、Apply的时候一定要注意级别(默认选择最高级别)
3、在层级视图中的预设体对象有自己独立的属性,修改完本身后不影响层级视图中其他预设体的状态。
天空盒:天空盒就是3D场景中所处的环境,一共有六个面
步骤:创建一个材质球->在材质球检视视图右上角有一个Shader(着色器)->SkyBox->6Slider(6个面)->给对应的面选择图片(点击Select)->将做好的材质球拖入到Scene即可
恢复成默认的天空盒步骤:
Window->Lighting->Scene->Sky Box->点击成默认的天空盒即可。

没有更多推荐了,返回首页