零基础的Unity图形学笔记3:使用多模型UV与优化模型导出

https://zhuanlan.zhihu.com/p/126752791

前文所说,贴图多UV,直接命名对应贴图就可以。

模型的多套UV,则需要在3DMAX里编辑。

这篇文章主要解决两个问题:

  1. 如何正确使用多模型UV? 从3DMAX导出,到shader使用
  2. 如何优化模型导出的内存占用?

 

1.模型导出会有几套UV?

如果在3d模型中只做了一套uv,将模型导入unity的时候,在导入设置中勾选Generate Lightmap UVs, unity会自动为我们生成用于光照贴图的uv1,和用于动态光照的uv2

比如Unity自带的物体box,sphere就自带两套uv

第一套是正常的,比如方块可以每个面是同一个uv,

但是第二套需要烘焙光照信息,所以默认是全展开,纹理看出来要小些。

也有一些材质会用到四套UV,比如Unity的speedtree。

2.模型多UV有什么作用

做很多效果时,使用多UV可以避免使用多材质,或者多贴图,性能更好。

其实额外的UV可以替代很多mask贴图实现的效果。


3. 如何自己在模型中添加第二套UV

3DMax和maya等软件都能对模型加多套uv

注意模型在fbx里可以保留多套uv,但是obj里只能保留默认的第一套

另外unity里现在貌似支持最多四套

 

开始在3DMAX里制作两套UV

uv0

UV1

 


这是我们刚才操作过的茶壶,现在它多出了个MAP2,也就是我们的第二套UV。

 

我们使用下面的Shader在Unity里测试:

Shader "UV/multiTextureUV" {
	Properties{
		_MainTex("Texture", 2D) = "white" { }
	}
		SubShader{
		Pass{
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		#pragma target 3.0

		sampler2D _MainTex; uniform float4 _MainTex_ST;
		struct appdata {
			float4 vertex : POSITION;
			// 多套uv的语义声明
			float2 texUV0 : TEXCOORD0;
			float2 texUV1 : TEXCOORD1;
			float2 uv3 : TEXCOORD2;
			float2 uv4 : TEXCOORD3;
			float2 uv5 : TEXCOORD4;
		};

		struct v2f {
			float4 pos : SV_POSITION;
			float2 uv_MainTex : TEXCOORD0;
			float2 uv2_Tex_002 : TEXCOORD1;
		};
		//顶点函数
		v2f vert(appdata input)
		{
			v2f o;
			o.pos = UnityObjectToClipPos(input.vertex);
			o.uv_MainTex = input.texUV0;
			o.uv2_Tex_002 = input.texUV1;
			return o;
		}

		fixed4 frag(v2f i) : SV_Target
		{
			fixed2 main_uv = i.uv_MainTex;
			fixed2 _Tex_2_uv = i.uv2_Tex_002;
			//在这里替换测试
			//如果没有多套uv 后面的值还是会返回uv0
			//return tex2D(_MainTex, _Tex_2_uv);
			return tex2D(_MainTex, main_uv);
		}
			ENDCG
		}
	}
}
uv0
uv0

 

 

uv1
uv1

 

结果如上,我们实现了 不同模型UV的采样。

当然这个是会影响烘焙光照的。 因为Unity默认使用第二套UV作为lightmap的采样UV。

如果我们导入的模型使用了第二套UV,Unity就不会自动给模型加入第二套UV了。

 

4.解决unity导入模型内存占用

 

4. 1删除color

经过验证,在3DMAX里,制作一个模型导出,一般情况,美术人员没有手动修改,只会多出一个color,然而我们大多数情况不需要,可以删除。

如果想去掉color通道的话直接去掉alpha通道就行。

我们把刚才茶壶的color通道删除,惊喜的发现,模型变小了,并且它占用Unity的内存也会变小。

4. 2删除多层UV通道

某些时候,因为美术的一些意外操作,会引入多个我们不需要的UV通道。

由于unity的光照贴图会自动占用uv2通道,如果你的项目中又使用的是动态加载光照贴图的方式的话,最好不要在导入模型的时候把UV2设置为null,如果你这样做了有可能会导致光照贴图显示不出来的问题。

如果物体不需要烘培,你自己也不使用uv2,则可以删除该通道。

 

方法一:

在max中进行设置把没有必要的通道全部clear掉,具体的操作请看下面的截图:

 

方法二:

程序这边进行处理,做一个工具,对每个导入到unity中的模型代码中清除相应的通道,具体的代码如下

public class ClearModelUV:AssetPostprocessor

{

void OnPostprocessModel(GameObject rImaportModel)

{

this.ClearMeshUVAndColorChannel(rImaportModel);

}

private void ClearMeshUVAndColorChannel(GameObject rImportModel)

{

List<Vector2> rNewUV = null;

List<Color32> rNewColor = null;

var rFilters= rImportModel.GetComponentsInChildren<MeshFilter>();

for (int filter_index = 0; filter_index < rFilters.Length; filter_index++)

{

rFilters[filter_index].sharedMesh.SetColors(rNewColor);

rFilters[filter_index].sharedMesh.SetUVs(1, rNewUV);

rFilters[filter_index].sharedMesh.SetUVs(2, rNewUV);

rFilters[filter_index].sharedMesh.SetUVs(3, rNewUV);

}

}

}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity可以通过FBX格式导出模型。FBX是一种常用的3D模型格式,被广泛用于游戏开发和3D建模领域。使用Unity导出FBX可以方便地将模型在不同的软件和平台之间进行交互和共享。 要导出模型为FBX,首先需要在Unity中选择要导出模型对象。可以在场景中选择一个或多个模型对象,也可以在资源管理器中选中模型文件。然后,在Inspector视图中,找到模型导入设置,将其选项展开。 在模型导入设置中,可以进行不同的配置。例如,可以选择导出模型的哪些部(如网格、动画、材质等),是否带有动画、骨骼绑定信息等。还可以调整导出的FBX文件的单位(米、厘米、毫米等)和旋转轴。 完成设置后,点击导出按钮,选择导出的文件路径和文件名,确认导出操作。Unity会将选中的模型模型文件导出为一个或多个FBX文件。导出的FBX文件可以在其他3D建模软件(如Maya、3ds Max)中打开和编辑,也可以在其他游戏引擎或平台中使用。 需要注意的是,导出模型可能会丢失部细节或属性,因为不同软件之间的兼容性可能存在差异。在进行模型导出之前,建议先进行一些兼容性测试,以确保导出的FBX文件能在其他软件和平台上正确显示和使用。 总之,Unity支持通过FBX格式导出模型,这为游戏开发者和3D建模师提供了更大的灵活性和便利性。通过导出FBX,可以更好地在不同软件和平台之间进行模型交互和共享。 ### 回答2: Unity是一款流行的游戏引擎,它允许用户使用3D建模软件创建游戏对象。当我们在Unity中创建或导入一个3D模型后,我们可以将其导出为FBX(Filmbox)格式,以便在其他应用程序中使用或与其他人享。 将模型导出为FBX格式有几个好处。首先,FBX是一种通用的文件格式,几乎可以在任何支持3D渲染的应用程序中导入和使用。这意味着我们可以在其他建模软件中打开和编辑导出模型,或者在其他游戏引擎中使用它。因此,将模型导出为FBX可以使我们的工作流程更加灵活和高效。 其次,FBX格式支持多种属性和功能,如纹理映射、骨骼动画、蒙皮权重等。这些属性和功能在游戏开发和动画制作中非常常见,因此,将模型导出为FBX可以确保这些特性的保留。不仅如此,FBX格式还支持多边形和NURBS等多种几何体类型,因此我们可以选择适合我们需求的几何体类型来导出模型。 在Unity中,将模型导出为FBX非常简单。我们只需选择要导出模型文件,右键点击并选择“导出”选项,然后选择FBX格式并指定保存路径。在导出选项中,我们还可以选择导出模型的具体属性和功能,确保导出后的模型能够满足我们的要求。 总而言之,将模型导出为FBX格式是Unity中常见的操作。它使我们能够方便地在其他应用程序中使用和编辑模型,并确保导出模型能够保留所需的属性和功能。这使得我们的游戏开发和动画制作工作更加灵活和高效。 ### 回答3: Unity是一款强大的游戏开发引擎,它支持多种模型导出格式,其中包括FBX。 FBX是一种通用的3D模型文件格式,可以在不同的软件中导入和导出。在 Unity 中将模型导出为FBX格式,可以使其更容易与其他3D建模软件进行兼容和使用。 在Unity导出模型为FBX格式非常简单。首先,将模型导入到Unity中。在Unity编辑器中选择所需模型,在Inspector面板中找到“Rig”或“Asset”选项,然后选择“模型”并打开其Rig模块。 然后在Rig模块中,选择“Animation Type”。这里有三个选项可供选择:None、Generic和Humanoid。如果你的模型没有动画,选择“None”即可。如果你的模型有动画,并且你想在Unity使用它们,选择“Generic”。如果你的模型是以人形结构构建的,并且你想将其与Mecanim系统一起使用,选择“Humanoid”。 接下来,在导航栏中选择“文件”>“导出”>“FBX”,然后选择导出的文件路径和文件名。在导出窗口中,你可以选择导出FBX所需的选项,如包含动画、网格剖和材质等。如果你只想导出模型(没有材质和动画),你可以选择相应的选项。 最后,点击“导出”按钮。Unity使用所选的选项将模型导出为FBX文件。导出的FBX文件可以在其他3D建模软件中导入和编辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值