从CityEngine导出以及导入到Unity
2020-08-14 本文已影响0人
Dragon_boy
这一节讲一下导出CityEngine的模型并导入到Unity。
根据上一节所讲述的,生成模型后,我们用鼠标在视图中框选一部分模型,然后点击File-Export Models
:

可以看到有许多种格式可以选择,不过为了材质转换的方便,这里建议是
COLLADA
或FBX
,我们这里选择FBX
:
大部分设置保持不变即可,设置一下保存路径以及文件名。注意,这里的设置会重复利用实例,并合并使用相同材质的网格,相当于提前进行了一次静态批处理。
接着我们导入到Unity。打开Unity,新建一个保存模型的文件夹,然后将整个导出模型的文件夹拖进来(模型文件加上纹理文件),然后将模型拖到Hierarchy上。
我们随便点开一个模型看一下导入设置,主要看材质部分:

上面是默认情况,所有的模型材质会使用默认的Standard Shader,并且不可修改,效果如下:

可以看到有道路线和斑马线的地方全是错的,毕竟这里使用的是不透明贴图来进行Alpha测试,Standard Shader默认并没有这种功能,因此我们需要自己修改它的shader。
首先,将模型材质的导入设置修改为如下:

这样就可以自行修改Shader。
首先我们创建一个材质,以及Unlit Shader,代码如下:
Shader "Unlit/RoadLine"
{
Properties
{
_MainTex ("Albedo Map", 2D) = "white" {}
_NormalTex ("Normal Map", 2D) = "bump" {}
_AlphaMask ("Alpha Mask", 2D) = "white" {}
_Cutoff ("Cutoff", Range(0,1)) = 0.5
}
SubShader
{
Tags { "Queue" = "AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }
LOD 100
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
float4 tangent : TANGENT;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
float3 worldPos : TEXCOORD1;
float3 worldNormal : TEXCOORD2;
float3 lightDir : TEXCOORD3;
float3 viewDir : TEXCOORD4;
SHADOW_COORDS(5)
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _NormalTex;
float4 _NormalTex_ST;
sampler2D _AlphaMask;
float4 _AlphaMask_ST;
float _Cutoff;
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
TANGENT_SPACE_ROTATION;
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;
o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;
TRANSFER_SHADOW(o);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float alpha = tex2D(_AlphaMask, i.uv).r;
float3 tangentLightDir = normalize(i.lightDir);
float3 tangentViewDir = normalize(i.viewDir);
float4 packedNormal = tex2D(_NormalTex, i.uv);
float3 tangentNormal;
tangentNormal = UnpackNormal(packedNormal);
tangentNormal.z = sqrt(1.0-saturate(dot(tangentNormal.xy, tangentNormal.xy)));
float3 albedo = tex2D(_MainTex, i.uv).rgb;
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
float3 diffuse = _LightColor0.rgb * albedo * max(0, dot(tangentNormal, tangentLightDir));
//float3 halfDir = normalize(tangentLightDir + tangentViewDir);
//float3 specular = _LightColor0.rgb * _Specular.rgb* pow(max(0,dot(tangentNormal, halfDir)), _Gloss);
fixed shadow = SHADOW_ATTENUATION(i);
if (alpha == 0.0)
{
discard;
}
return fixed4(ambient + diffuse*shadow, 1.0);
}
ENDCG
}
}
FallBack "Transparent/Cutout/VertexLit"
}
很简单的shader,因为很难看出差别,我就不使用PBR的方式来建立,高光也不太需要,就使用了最简单的兰伯特光照模型。主要是使用不透明贴图的采样结果来剔除片段,黑色就剔除,白色留下。
需要注意的是Tag的设置,还有与阴影投射接收相关的预处理命令的设置。
将新shader赋予街道网络的斑马线和道路线部分后,结果如下:

至此,模型导入成功,并修正了一些不当的效果。
下一节介绍一下其它的效果以及加上一些游戏逻辑。