最近有个需求就是实现模型剖切,模型是个整体具体显示隐藏感觉通过unityapi实现太难了,寻思许久还是觉得通过shader来实现,原理很简单就是模型的三角面剔除,能gpu干的活就不麻烦cpu了,性能方面亲测没啥大的开销。
看效果:
直接看shader吧,也很简单,最好有点OpenGL基础,要不看起来很难受
----"surprise Mark Fuck图形学开发者"
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "HZ/DisModel"
{
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_ClipYPos("ClipYPosition",Float) = 0.5
_MainTex ("Main Texture", 2D) = "white"{}
[KeywordEnum(None, Z, Y, X)]_Mode("Mode", Float) = 0
}
SubShader
{
Pass
{
Cull off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
float _ClipYPos;
sampler2D _MainTex;
half4 _MainTex_ST;
float _Mode;
struct vertexOutput
{
float4 pos : SV_POSITION;
float4 posInObjectCoords : TEXCOORD1;
float2 uv : TEXCOORD0;
};
vertexOutput vert(appdata_full input)
{
vertexOutput output;
output.pos = UnityObjectToClipPos(input.vertex);
output.uv = TRANSFORM_TEX(input.texcoord, _MainTex);
output.posInObjectCoords = mul(unity_ObjectToWorld,input.vertex);
return output;
}
fixed4 frag(vertexOutput input) : SV_Target
{
float clipxyz;
if(_Mode==1){
clipxyz = input.posInObjectCoords.z - _ClipYPos;
}
if(_Mode==2){
clipxyz = input.posInObjectCoords.y - _ClipYPos;
}
if(_Mode==3){
clipxyz = input.posInObjectCoords.x - _ClipYPos;
}
if (clipxyz > 0.0&&_Mode!=0)
{
discard;
}
fixed4 col=_Color;
return col;
}
ENDCG
}
}
}