unity3d DirectX 模型
在一个面向 Web 和 PC 的项目中,最初使用了一个 Plane 对象,并在其上添加带有背景图片的材质球作为背景。通过改变 Plane 的 Z 轴属性,能够控制背景显示在 3D 模型之后。然而,背景的自适应问题难以解决,手动改变 Plane 的 Scale 属性虽能让背景在特定窗口中铺满,但无法适配所有分辨率的窗口。之后尝试通过动态代码在 Plane 上添加 Texture2D 图片,却发现无论如何调整模型的 Z 轴属性,都无法使模型显示在背景之前。经过一番摸索,最终成功解决该问题,以下是详细的摸索过程。
MeshRenderer(网格渲染器)的作用
在深入解决背景显示问题之前,有必要先了解 MeshRenderer(网格渲染器)的作用。如果不勾选 MeshRenderer,在 Game 场景中将无法看到 Plane 对象。MeshRenderer 的主要功能是将材质渲染出来,材质中包含 Texture(纹理)属性,我们既可以选择自定义的贴图,也可以选择纯色,MeshRenderer 会将材质中的这些信息渲染出来,让我们能够看到相应的效果。最初的背景图就是通过这种方式实现的,但后续将介绍另一种利用添加 GUITexture 并结合多个摄像机协作来实现背景显示的方法。
解决步骤
步骤 1:添加背景摄像机并设置相关属性
- 添加一个新的摄像机,将其命名为
BackgroundCamera。 - 在 Layer(图层)中添加一个名为
background的图层。 - 将 Plane 对象拖放到
BackgroundCamera节点下。 - 将
BackgroundCamera和 Plane 都设置到background图层。 - 修改
BackgroundCamera的ClearFlags为Depth only(仅深度渲染)。 - 设置
CullingMask为仅显示background图层,即只让该摄像机看到background图层的对象。 - 设置
Depth为 -1,表示背景层是最深的。其他模型所在摄像机的Depth为 0,NGUI(一种 UI 插件)所在摄像机的Depth为 1。这样的层次关系确保了 NGUI 在最前面,模型层其次,背景层在最后,从而保证 3D 模型能够显示在背景的前面。
步骤 2:设置主摄像机属性
对 MainCamera 进行同样的设置,但需要注意的是,要将 MainCamera 的 CullingMask 设置为不包含 background 图层,这样 MainCamera 就看不到背景层的对象,避免出现背景遮挡模型的情况。
步骤 3:在 Plane 上添加脚本以动态加载贴图
以下是添加到 Plane 上的脚本代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class AddBackground : MonoBehaviour
{
public Texture2D mtexture;
void Awake()
{
// 原本尝试创建纹理并应用到材质的代码,已注释
// Texture2D mtxture = new Texture2D(Screen.width, Screen.height);
// renderer.material.mainTexture = mtxture;
// mtxture.Apply();
gameObject.AddComponent<GUITexture>();
}
// Use this for initialization
void Start()
{
guiTexture.texture = mtexture;
transform.localScale = new Vector3(0, 0, 0);
transform.localPosition = new Vector3(0, 0, 25);
guiTexture.pixelInset = new Rect(65, 0, Screen.width, Screen.height);
}
}
在上述 Start 方法中,原本尝试通过设置 position 的 Z 轴属性来修改深度,但后来发现这种方法行不通,实际影响渲染深度的是图层关系。
步骤 4:查看效果图
完成上述设置和代码添加后,运行项目即可看到 3D 模型正确显示在背景前面的效果。
通过以上步骤,我们成功解决了 Unity3D 项目中 3D 模型与背景显示顺序的问题,并且实现了背景的动态加载和显示。