这个教程覆盖了表面擦除(discarding fragments)、前脸剔除(front-face)和后脸剔除(back-face)。本篇文章假定你熟悉《RGB 立方体》章节。
性能消耗非常低的剖面,unity中默认情况下渲染引擎剔除了物体背面。
本篇教程的主题是切去渲染网格中三角形或者片段。这么做主要有两个原因:我们想看穿一个三角形或者片段,另一情况是三角形始终是不可见的。同时我们不处理不可见的元素还可以节省一些性能。这两种裁剪方式 GPU 都支持,我们将要讨论他们。
当坐标 y为正(大于零)时,片段会被裁剪掉。着色器的代码如下:
Shader "LT/Discard2"
{
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_ClipYPos("ClipYPosition",Float) = 0.5
_MainTex ("Main Texture", 2D) = "white"{}
}
SubShader
{
Pass
{
Cull off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
float _ClipYPos;
sampler2D _MainTex;
half4 _MainTex_ST;
struct vertexOutput
{
float4 pos : SV_POSITION;
float4 posInObjectCoords : TEXCOORD1;
float2 uv : TEXCOORD0;
};
vertexOutput vert(appdata_full input)
{
vertexOutput output;
output.pos = mul(UNITY_MATRIX_MVP, 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 clipY = input.posInObjectCoords.y - _ClipYPos;
if (clipY > 0.0)
{
discard; //判断是顶点坐标是否大于0要裁剪.
}
fixed4 col =_Color * tex2D(_MainTex,input.uv) * input.posInObjectCoords.y;
return col;
}
ENDCG
}
}
}