从CityEngine导出以及导入到Unity

2020-08-14  本文已影响0人  Dragon_boy

这一节讲一下导出CityEngine的模型并导入到Unity。

根据上一节所讲述的,生成模型后,我们用鼠标在视图中框选一部分模型,然后点击File-Export Models:


可以看到有许多种格式可以选择,不过为了材质转换的方便,这里建议是COLLADAFBX,我们这里选择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赋予街道网络的斑马线和道路线部分后,结果如下:


至此,模型导入成功,并修正了一些不当的效果。

下一节介绍一下其它的效果以及加上一些游戏逻辑。

上一篇 下一篇

猜你喜欢

热点阅读