Shader学习之案例—《镜子1》
2016-08-26 09:38
323 查看
废话不多说先上效果图,我使用的是在unity5.3.3版本。
[align=left]一、原理[/align]
[align=left]1、首先要准备的素材是三个,对没错,就是三个因为镜子里面的那个物体其实是实物的复制体而已;一个Plane作为镜子,还有一个实物和虚物体。[/align]
[align=left]2、新建一个材质使用下面的Shader代码,并将此材质球赋给那个虚物体[/align]
[C#] 纯文本查看 复制代码
[code= csharp; gutter: true">Shader "Custom/Cg shader for virtual objects in mirrors" {
Properties{
_Color("Virtual Object's Color", Color) = (1, 1, 1, 1)
}
SubShader{
Tags{ "Queue" = "Transparent+20" }
Pass{
Blend OneMinusDstAlpha DstAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float4 _Color;
uniform float4x4 _WorldToMirror;
struct vertexInput {
float4 vertex : POSITION;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 posInMirror : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.posInMirror = mul(_WorldToMirror,
mul(_Object2World, input.vertex));
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}
float4 frag(vertexOutput input) : COLOR
{
//如果镜子里的物体出来了就剔除掉
if (input.posInMirror.y > 0.0)
{
discard;
}
return float4(_Color.rgb, 0.0);
}
ENDCG
}
}
}
[align=left]3、另外在建一个材质使用下面的Shader代码,并将此材质球赋值给实物体[/align]
[align=left]一、原理[/align]
[align=left]1、首先要准备的素材是三个,对没错,就是三个因为镜子里面的那个物体其实是实物的复制体而已;一个Plane作为镜子,还有一个实物和虚物体。[/align]
[align=left]2、新建一个材质使用下面的Shader代码,并将此材质球赋给那个虚物体[/align]
[C#] 纯文本查看 复制代码
[code= csharp; gutter: true">Shader "Custom/Cg shader for virtual objects in mirrors" {
Properties{
_Color("Virtual Object's Color", Color) = (1, 1, 1, 1)
}
SubShader{
Tags{ "Queue" = "Transparent+20" }
Pass{
Blend OneMinusDstAlpha DstAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float4 _Color;
uniform float4x4 _WorldToMirror;
struct vertexInput {
float4 vertex : POSITION;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 posInMirror : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.posInMirror = mul(_WorldToMirror,
mul(_Object2World, input.vertex));
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}
float4 frag(vertexOutput input) : COLOR
{
//如果镜子里的物体出来了就剔除掉
if (input.posInMirror.y > 0.0)
{
discard;
}
return float4(_Color.rgb, 0.0);
}
ENDCG
}
}
}
[align=left]3、另外在建一个材质使用下面的Shader代码,并将此材质球赋值给实物体[/align]
相关文章推荐
- Shader案例篇—《镜子1》
- Shader学习案例三---屏幕特效之色彩调节
- 分享一个Shader学习案例比较多的网址
- Shader学习案例一---屏幕特效之黑白化当前屏幕
- 分享一个Shader学习案例比较多的网址
- 《被误解的C++——学习和使用》的案例
- Ruby on Rails案例学习:ChangingThePresent.org
- 学习队列、栈的经典案例--Re:停车场管理模拟修改版
- 案例学习:如何让你的SQL运行得更快
- NET移植案例学习:建造Web站点(4)
- 【一个不错的oracle数据库诊断例子,值得学习一下】Oracle数据库诊断案例-redo log日志组处于高激活状态
- NET移植案例学习:建造Web站点(1)
- 在学习webwork案例中碰到了静态的内部类
- 软件工程案例学习-图书管理系统
- 案例学习:如何让你的SQL运行得更快
- 案例学习:如何让你的SQL运行得更快
- 学习YUI.Ext第七日-View&JSONView Part Two-一个画室网站的案例
- 软件工程案例学习-网上购书系统
- 学习管理!!中国历史上最经典的7个智慧案例
- 网络工程师学习资料:路由器配置案例分析