成都Unity 2017技术路演
今天和小伙伴参加了Unity 2017技术路演,很可惜讲师讲的Shader和VR课程过于入门向了,并没有学到很多东西,倒是第一位讲师,提到的插件和Unity Service引起了我一些兴趣,如果Unity Cloud build好用,我就不需要再自己搭建集成构建环境了,而且集成支付和广告会也许会更加方便。
会场照片:
会场合影 会场发的VR设备 热闹的会场环境 讲师在帮我们解决问题
还有一个值得一提的插曲
我把公司项目遇到的一个实时阴影有时候会消失的BUG向讲师请教,讲师给出的建议是修改Unity原生的standard Shader加入一个支持光照贴图的Pass,结果我们尝试失败后再次向讲师请教,结果发现其实这条道路行不通,standard Shader在检视面板上的内容都是固定的,不能增加新的属性。
然后退而求其次去修改原来的Shader,讲师似乎连MVP变换都不是很清楚,在各种方法尝试了一通之后,时间已经是下午5点半,于是我们只好提出告辞。
这个BUG是这样的,场景的Shader如下,功能是使用光照贴图并接收实时阴影,使用了这个Shader的场景不能正常接收阴影,但是摄影机周围有standard Shader材质的物体时,又可以正常接受阴影。(所以目前我们用了一个非常hack的方法来解决这个问题,就是让我们投射阴影的主角身上挂一个很小的standard 材质的 Cube:)
Shader如下:
Shader "Custom/MYlightmap" {
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_LightMap ("Lightmap (RGB)", 2D) = "black" {}
_MainColor("Color",Color) = (1,1,1,1)
}
SubShader
{
Pass
{
Tags{"queue" = "2100"}//晚于勇者投射阴影的队列
tags{"LightMode" = "ShadowCaster"}
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
#pragma multi_compile_fwdbase
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
half2 uv1:TEXCOORD1;
};
struct v2f
{
float2 uv : TEXCOORD0;
float2 light :TEXCOORD1;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
LIGHTING_COORDS(2,3)
};
sampler2D _MainTex;
sampler2D _LightMap;
float4 _LightMap_ST;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.light = TRANSFORM_TEX(v.uv1,_LightMap);
UNITY_TRANSFER_FOG(o,o.vertex);
TRANSFER_VERTEX_TO_FRAGMENT(o)
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
fixed4 lm = tex2D(_LightMap, i.light)*2;
col.rgb *= lm.rgb;
float atten= LIGHT_ATTENUATION(i);
col.rgb *= atten;
col.rgb *= UNITY_LIGHTMODEL_AMBIENT * 6;
return col;
}
ENDCG
}
}
}
}
后记
后来问题解决了,原来是Shader没有加lightMode
所致。在shader上添加{"lightMode"= "forwardbase"}
即可解决