把一个cube用边框形式表现出来(Unity shader)
2014-05-29 17:07
253 查看
这不是我原创的,是我修改别人的, 原版只有一个pass,且 Cull Off,但这样
不知为什么有的边框会被遮挡(我感觉应该不会遮挡),最后我用了两个pass,
第一个 Cull Front,第二个 Cull Back,效果就Ok了,创建一个Cube,一个matirial,把
这个shader加上,调调颜色,效果很不错!,但为什么只用一个Pass把Cull 设为 Off不行呢??
Shader "Custom/WireFrame" {
Properties
{
_LineColor ("Line Color", Color) = (1,1,1,1)
_GridColor ("Grid Color", Color) = (1,1,1,0)
_LineWidth ("Line Width", float) = 0.2
}
SubShader
{
Pass
{
Tags { "RenderType" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha//这句可以注释掉,能够避免线框太粗出现的模糊效果。
//AlphaTest Greater 0.5
Cull Front//这句是后加的,取消遮挡消隐,体现出透明
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float4 _LineColor;
uniform float4 _GridColor;
uniform float _LineWidth;
// vertex input: position, uv1, uv2
struct appdata
{
float4 vertex : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
struct v2f
{
float4 pos : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex);
o.texcoord1 = v.texcoord1;
o.color = v.color;
return o;
}
fixed4 frag(v2f i) : COLOR
{
fixed4 answer;
float lx = step(_LineWidth, i.texcoord1.x);
float ly = step(_LineWidth, i.texcoord1.y);
float hx = step(i.texcoord1.x, 1.0 - _LineWidth);
float hy = step(i.texcoord1.y, 1.0 - _LineWidth);
answer = lerp(_LineColor, _GridColor, lx*ly*hx*hy);
return answer;
}
ENDCG
}
// add another
Pass
{
Tags { "RenderType" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha//这句可以注释掉,能够避免线框太粗出现的模糊效果。
//AlphaTest Greater 0.5
Cull Back//only this is different
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float4 _LineColor;
uniform float4 _GridColor;
uniform float _LineWidth;
// vertex input: position, uv1, uv2
struct appdata
{
float4 vertex : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
struct v2f
{
float4 pos : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex);
o.texcoord1 = v.texcoord1;
o.color = v.color;
return o;
}
fixed4 frag(v2f i) : COLOR
{
fixed4 answer;
float lx = step(_LineWidth, i.texcoord1.x);
float ly = step(_LineWidth, i.texcoord1.y);
float hx = step(i.texcoord1.x, 1.0 - _LineWidth);
float hy = step(i.texcoord1.y, 1.0 - _LineWidth);
answer = lerp(_LineColor, _GridColor, lx*ly*hx*hy);
return answer;
}
ENDCG
}
}
Fallback "Vertex Colored", 1
}
不知为什么有的边框会被遮挡(我感觉应该不会遮挡),最后我用了两个pass,
第一个 Cull Front,第二个 Cull Back,效果就Ok了,创建一个Cube,一个matirial,把
这个shader加上,调调颜色,效果很不错!,但为什么只用一个Pass把Cull 设为 Off不行呢??
Shader "Custom/WireFrame" {
Properties
{
_LineColor ("Line Color", Color) = (1,1,1,1)
_GridColor ("Grid Color", Color) = (1,1,1,0)
_LineWidth ("Line Width", float) = 0.2
}
SubShader
{
Pass
{
Tags { "RenderType" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha//这句可以注释掉,能够避免线框太粗出现的模糊效果。
//AlphaTest Greater 0.5
Cull Front//这句是后加的,取消遮挡消隐,体现出透明
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float4 _LineColor;
uniform float4 _GridColor;
uniform float _LineWidth;
// vertex input: position, uv1, uv2
struct appdata
{
float4 vertex : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
struct v2f
{
float4 pos : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex);
o.texcoord1 = v.texcoord1;
o.color = v.color;
return o;
}
fixed4 frag(v2f i) : COLOR
{
fixed4 answer;
float lx = step(_LineWidth, i.texcoord1.x);
float ly = step(_LineWidth, i.texcoord1.y);
float hx = step(i.texcoord1.x, 1.0 - _LineWidth);
float hy = step(i.texcoord1.y, 1.0 - _LineWidth);
answer = lerp(_LineColor, _GridColor, lx*ly*hx*hy);
return answer;
}
ENDCG
}
// add another
Pass
{
Tags { "RenderType" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha//这句可以注释掉,能够避免线框太粗出现的模糊效果。
//AlphaTest Greater 0.5
Cull Back//only this is different
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float4 _LineColor;
uniform float4 _GridColor;
uniform float _LineWidth;
// vertex input: position, uv1, uv2
struct appdata
{
float4 vertex : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
struct v2f
{
float4 pos : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex);
o.texcoord1 = v.texcoord1;
o.color = v.color;
return o;
}
fixed4 frag(v2f i) : COLOR
{
fixed4 answer;
float lx = step(_LineWidth, i.texcoord1.x);
float ly = step(_LineWidth, i.texcoord1.y);
float hx = step(i.texcoord1.x, 1.0 - _LineWidth);
float hy = step(i.texcoord1.y, 1.0 - _LineWidth);
answer = lerp(_LineColor, _GridColor, lx*ly*hx*hy);
return answer;
}
ENDCG
}
}
Fallback "Vertex Colored", 1
}
相关文章推荐
- 当前表单的所有信息以对话框的形式表现出来,请问怎么解决?
- Java IO把一个文件中的内容以字符串的形式读出来
- 一个会员分红结算,以二叉树形式显示出来他的安置图,还可查看推荐图
- unserialize的这个问题是由一个emlog论坛用户在使用时报错而发现的 问题表现情况如下: emlog缓存的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放,
- 要求把一个字符串中1存在的位置区间表现出来
- sql 查询字段 两个字段以一个字段的形式显示 + 同属一个组的 在一个行列中显示出来 以逗号分隔
- 汇编语言: 试编制一个程序,把BX寄存器内的二进制数以十进制数的形式在屏幕上显示出来。
- 把一个int()或者byte(字节)以二进制的形式打印出来
- sql 查询字段 两个字段以一个字段的形式显示 + 同属一个组的 在一个行列中显示出来 以逗号分隔
- 字体设计的形式表现出来
- sql 查询字段 两个字段以一个字段的形式显示 + 同属一个组的 在一个行列中显示出来 以逗号分隔
- 汇编语言: 试编制一个程序,把BX寄存器内的二进制数以十六进制数的形式在屏幕上显示出来
- 浏览器以图片格式请求一个aspx页面和以iframe形式请求页面,在服务器端可以判断出来么?
- /*用c#!!输入一个数如果是质数则输出该数是质数,如果是合数用质因子乘积的形式输出来如8=2*2*2*/
- 汇编语言: 编写一个程序,从键盘输入一个不长于8位的四进制数,并将所输入的数以10进制数 形式显示出来。
- 编制一个程序把BX寄存器内的二进制数用十六进制的形式在屏幕上显示出来
- 将一个图片以二进制值的形式存入Xml文件中
- 使用C#编写的一个定时关机程序(我也不记得是谁写的了,偶翻出来了就贴了)
- 俺写不出来 先贴一个别人的《如何成为一名黑客》
- 一个js日期选择器。当光标移到文本框时。自动会在文本框的底部显示出来。