地址
https://en.wikibooks.org/wiki/Cg_Programming/Unity/Cutaways
重点
1.
discarding fragments
2.
front-face and back-face culling
代码一
Shader "Cg shader using discard" {
SubShader {
Pass {
Cull Off // turn off triangle culling, alternatives are:
// Cull Back (or nothing): cull only back faces
// Cull Front : cull only front faces
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct vertexInput {
float4 vertex : POSITION;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 posInObjectCoords : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);//解压得到当前模型视图投影矩阵
output.posInObjectCoords = input.vertex; //此处用于把自己的坐标(位置信息)存储, TEXCOORD0语义并无太大意义
return output;
}
float4 frag(vertexOutput input) : COLOR {
//在此处根据自身的坐标判断显示那种颜色
if (input.posInObjectCoords.y > 0.0)
{
discard; // drop the fragment if y coordinate > 0
//这里丢弃y大于0的部分的颜色信息
//discard 指令丢弃 昂贵的
}
return float4(0.0, 1.0, 0.0, 1.0); // green
}
ENDCG
}
}
}
Cull 有三种
Cull Off 不剔除
Cull Back 剔除背面(外部)
Cull Front 剔除前面 (内部)
根据上面的代码可以判断出效果,即显示物体的下半部分
Cull Off 不剔除
Cull Back 剔除背面(外部)
Cull Front 剔除前面 (内部)
根据上面的代码可以判断出效果,即显示物体的下半部分
效果图
代码二
Shader "Cg shader with two passes using discard" {
SubShader {
// first pass (is executed before the second pass)
Pass {
Cull Front // cull only front faces
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct vertexInput {
float4 vertex : POSITION;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 posInObjectCoords : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
output.posInObjectCoords = input.vertex;
return output;
}
float4 frag(vertexOutput input) : COLOR
{
if (input.posInObjectCoords.y > 0.0)
{
discard; // drop the fragment if y coordinate > 0
}
return float4(1.0, 0.0, 0.0, 1.0); // red
}
ENDCG
}
// second pass (is executed after the first pass)
Pass {
Cull Back // cull only back faces
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct vertexInput {
float4 vertex : POSITION;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 posInObjectCoords : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
output.posInObjectCoords = input.vertex;
return output;
}
float4 frag(vertexOutput input) : COLOR
{
if (input.posInObjectCoords.y > 0.0)
{
discard; // drop the fragment if y coordinate > 0
}
return float4(0.0, 1.0, 0.0, 1.0); // green
}
ENDCG
}
}
}
这部分和前一部分差不多,只是多了一个通道,在通道一中剔除表面,在通道二中剔除里面。
效果图