模型显示在ui上面
如图显示模型
1设置模型的Layer为ui相机显示的值,这里设置为NGUI
2把模型拉近相机,不要被ui渲染遮挡
3需要放大模型因为NGUI的UIRoot会缩小
有一个问题就是我使用了Scrollview组件我希望ui被裁减时,模型也一起裁剪
自定义裁剪shader
1设置显示范围,超出这个范围就丢弃当前片段
这里我是全局设置一个裁剪范围
public class test : MonoBehaviour {
public Transform left;
public Transform right;
// Use this for initialization
void Start () {
UnityEngine.Shader.SetGlobalVector("clipRange", new Vector4(left.position.x, left.position.y, right.position.x, right.position.y));
}
}
Shader "Unlit/clipModel"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
Cull Back
Lighting Off
Offset -1, -1
Fog{ Mode Off }
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 clipRange;//渲染范围 左上到右下的矩形范围显示
struct appdata_t
{
float4 vertex : POSITION;
half4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : POSITION;
half4 color : COLOR;
float2 texcoord : TEXCOORD0;
float2 worldPos : TEXCOORD1;
};
v2f vert(appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.texcoord = v.texcoord;
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
return o;
}
half4 frag(v2f IN) : COLOR
{
half4 col = tex2D(_MainTex, IN.texcoord) * IN.color;
float2 factor = float2(0, 0);
//判断是否在显示框内
if (IN.worldPos.x >clipRange.x && IN.worldPos.x < clipRange.z)
{
factor.x = 1;
}
if (IN.worldPos.y < clipRange.y && IN.worldPos.y > clipRange.w)
{
factor.y = 1;
}
//x,y坐标一个出框了就裁剪掉
col.a = min(factor.x, factor.y);
clip(col.a < 0.1f ? -1 : 1);
return col;
}
ENDCG
}
}
}
效果出了,还不错
这里我用了,两个位置去定义裁剪范围,不想用的话就用UIScrollView.panel的属性计算裁剪框吧
UIScrollView.panel 计算裁剪位置
UIScrollView.panel.finalClipRegion 里面包含了裁剪相关信息,xy是center zw是size offset已经计算好了,根据这两个位置就可以计算出来左上,右下点裁剪点。
示意代码
public void Update()
{
var pos = sv.transform.position;
Vector3 tl = Vector3.zero;
Vector3 rb = Vector3.zero;
//关键计算
tl.x = sv.panel.finalClipRegion.x - sv.panel.finalClipRegion.z / 2;
tl.y = sv.panel.finalClipRegion.y + sv.panel.finalClipRegion.w / 2;
rb.x = sv.panel.finalClipRegion.x + sv.panel.finalClipRegion.z / 2;
rb.y = sv.panel.finalClipRegion.y - sv.panel.finalClipRegion.w / 2;
leftTop.transform.position = (tl + pos) * 0.00149925f;//uiroot 需要缩小的倍数
rightBottom.transform.position = (rb + pos)* 0.00149925f;//uiroot 需要缩小的倍数
}