unity5.3 版本 地板砖unity 实时镜面反射反射 shader 如何制作

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
关注:1811
当前位置: &
__________________________________________________________________________________
开发者干货区版块规则:
  1、文章必须是图文形式。(至少2幅图)
& && &2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
& && &3、本版块只支持在游戏蛮牛原创首发,不支持转载。
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
& && &5、......
__________________________________________________________________________________
查看: 5596|回复: 13
【UnityShader从零开始】镜面反射效果
本帖为抢楼帖,欢迎抢楼!&
9排名<font color="#FF昨日变化3主题帖子积分
在线时间171 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 esfog 于
12:54 编辑
原文链接在我的Blog中:/Esfog/p/3589784.html ,有任何欢迎在本帖或者或者我的Blog中留言与我讨论.
& &&&系列教程第四篇,这一期我们来讨论一下关于镜面反射的基本原理和具体代码.这一篇是承接着上一篇来讲述的,如果你还没有看或者对漫反射不是很了解的话,建议去看一下,这样子有助于你更好的理解本篇教程.
镜面反射SpecularReflection
  上一篇关于漫反射的讲解中,我们说过光照处理里面两个最常见的课题也就是漫反射和镜面反射(高光)。那么这节我们就来说一下镜面反射,顺带把环境光也说一下,这样做出来的效果更好一些.类似于上一篇,我们还是来先说明一下镜面反射(为了方面,下面一律称高光)。
-1.jpg (30.28 KB, 下载次数: 4)
12:36 上传
  如上图(图片来自网络),这两种反射给人的直观感受,我相信大家一定在生活中有所了解,上次我们说过漫反射的效果让我们对物体的某一个位置,无论我们从哪个位置观察它,我们看到的亮度都是一样的.而镜面反射则不然,你从不同的位置去观察物体的同一个点的受光照情况,看到的结果是不一样的,因为光照的反射不再是各个方向的反射量均匀了,而是在与反射光线与视线的偏差大小有着反比关系,如果你的视线与反射光线重合,那么看到的将是最亮的,如果角度大于90度那将看不到高光效果。一个比较好的例子就是在阳光下我们观察表面很光滑的汽车,你会发现汽车外壳上的高光区域会随着你观察位置的不同而移动和变化。 
f.jpg (29.1 KB, 下载次数: 2)
12:38 上传
  如上图(图片取自《Cg Programming in Unity》),要计算镜面反射,我们需要知道的东西可能要比漫反射多一些,一共4个向量,光的入射方向L(反方向,下同),表面法线N,观察的目标位置到摄像机的向量V(视线),以及反射光线R,和漫反射一样,我们这里只考虑平行光的情况,其他类型的光源于其有所不同,大家自行了解,这里就不赘述了,如果有地方用到了,也可以到时候具体说明.
  参考着上面这幅图,我们来说明一下它的计算原理,前面提到其实最终决定我们看到的光的强弱的是视线V和反射向量R,这两个向量的夹角越小说明越接近光线经过物体表面的反射直接反射到我们的眼睛(摄像机).两者的关系很类似与上一篇漫反射中入射光线L和法线N的关系.所以我们也通过V·R = |V|*|R|*cosθ.大家通过这个公式也应该可以明白为什么上面说镜面反射对于物体的同一个点你在不同位置观察看到的结果并不一样了吧.既然这里我们只用到了两个向量就可以决定最终的影响高光的因子,那为什么前面说需要四个向量呢,那是因为反射光线R是需要通过法线N和入射光线L进行计算得来的.
  我们先来说明一下如何通过N和L来计算得到R.
2.jpg (14.41 KB, 下载次数: 6)
12:36 上传
  如图所示(图片取自网友butwang博客),不难看出我们只要计算出一个向量s然后对其乘以2就可以得到2s然后根据向量的加法规则,我们可以利用L+2s = R来获取最终结果.那么首先来求向量s,要计算s就要利用L和L在N上的投影向量,因为N·L = |N|*|L|*cosθ,若N为单位向量,则|N| = 1所以N·L = |L|*cosθ,L在N上的投影距离为N·L,然后再将结果乘以N的单位向量,所以我们要先将N规范化才行,我们假设N就是规范化后的单位向量那么,L在N上的投影向量则为(L·N)*N,那么通过向量减法我们可以计算出s = (L·N)*N - L,进而计算出R = 2s + L = 2((L·N)*N-L) +L = 2N(N·L) - L.不过这么繁琐的逻辑,Cg已经帮我们搞定了,我们只需要通过reflect(L,N)函数就可以计算出反射向量,第一个参数是光的入射反向(注意,这里是真正的入射方向,不是反方向),第二个参数是法向量.
  下面给出《The Cg Tutorial》中给出的镜面反射计算公式(它的公式和下面的略有不同,我做了下变化,效果都是一样的):  
3.jpg (31.3 KB, 下载次数: 2)
12:36 上传
  先来解释一下这个公式,这个Ks是材质的反射颜色,和上一篇中漫反射公式里的Kd有些相似,Kd一般设置成贴图颜色即可,但是Ks一般不可以,我个人理解它是用来设置物体表面受到高光的时候应该呈现的一种高光颜色,如果你有相应的高光贴图,那么你可以利用Ks来读取贴图颜色来为不同的位置呈现不同的高光颜色,如果没有的话,默认设置成纯白就可以了,lightColor就是光源的颜色没什么好说的。facing这个要说一下,我们计算光照强度的时候用了V和R,但有的时候V和R虽然角度小于90度属于有效范围,但是这时候如果L和N的夹角已经大于90度了,实际上这个物体不应该在收到这个光照影响了,但是如果我们只看V和R,那么可能通过reflect函数计算出来的R向量与V的夹角不一定会大于90度,这样子我们就会使本不应该受到光照的地方受到了光照。所以我们加了一个facing变量,如果N和L夹角大于90度,则facing为0,否则为1。而对于max(V·R,0)和我们上节的max(N·L,0)差不多,这里就不说了,在max的外层还有一个指数shininess,这个是用来调整光泽度的,shininess越大,说明物体的表面越光泽,那么你看到的亮斑就越小越集中,否则越大越分散.为什么这么来实现,我也不太清楚,一般设为10较为适合。
  前面提到,我们要顺带说一下环境光的问题,这里简单描述一下,现实生活中,一个真实的物体除了从光源出直接接受光照之外,还会受到周围其它物体反射出去的光,有时候即使物体本身并没有受到光源直接照射,也会呈现出一定的亮度.在渲染中我们把这些受到其它物体反射所得到的光统称为环境光.在unity中场景中所有的物体使用同一的环境光,在Edit-&Render Setting-&Ambient Light你可以设置它,一半比较微弱.它无法与真实世界的效果相媲美,只是一种大致的模拟效果。下面给出《The Cg Tutorial》中给出的环境光计算公式:  
4.jpg (17.11 KB, 下载次数: 3)
12:36 上传
  其中Ka是材质关于环境光的系数,这个我理解成和漫反射中的Kd保持一致就行了,globalAmbient这个就是我们刚才设置的漫反射颜色.  最终我们要把这些颜色加在一起作为最终的结果 Color = ambient + diffuse + specular.下面看一下具体代码吧.
[C#] 纯文本查看 复制代码Shader &Esfog/SpecularReflection&
Properties
_MainTex (&Base (RGB)&, 2D) = &white& {}
_SpecColor(&SpecularColor&,Color) = (1,1,1,1)
_Shininess(&Shininess&,Float) = 10
Tags { &RenderType&=&Opaque& &LightMode&=&ForwardBase&}
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
#pragma target 5.0
uniform float4 _LightColor0;
uniform sampler2D _MainT
uniform float _S
uniform float4 _SpecC
struct VertexOutput
float4 pos:SV_POSITION;
float4 posWorld:TEXCOORD0;
float3 normal:TEXCOORD1;
float2 uv:TEXCOORD2;
VertexOutput vert(appdata_base input)
o.pos = mul(UNITY_MATRIX_MVP,input.vertex);
o.posWorld = mul(_Object2World,input.vertex);
o.normal = normalize(mul(float4(input.normal,0.0),_World2Object).xyz);
o.uv = input.texcoord.
float4 frag(VertexOutput input):COLOR
float3 normalDir = normalize(input.normal);
float3 viewDir = normalize(float3(_WorldSpaceCameraPos - input.posWorld));
float4 Kd = tex2D(_MainTex,input.uv);
float4 Ks = _SpecC
float4 Ka = Kd;
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
float3 ambientLighting = Ka.rgb * UNITY_LIGHTMODEL_AMBIENT.
float3 diffuseReflection = Kd.rgb * _LightColor0.rgb * max(0.0,dot(normalDir,lightDir));
if(dot(normalDir,lightDir)&=0)
facing = 0;
facing = 1;
float3 SpecularReflection = facing * _LightColor0.rgb * _SpecColor.rgb * pow(max(0,dot(reflect(-lightDir,normalDir),viewDir)),_Shininess);
return float4(ambientLighting + diffuseReflection + SpecularReflection,1);
FallBack &Diffuse&
  有的地方和漫反射的基本相同,我只解释这节中的新地方.  第6~7行在Properties中我们定义了一个新的变量_Shininess,float类型的,和Color类型的_SpecColor,其中_Shininess用来调节物体表面的光泽度.原理在前面解释过了._SpecColor用来调整高光反射颜色,如果你有高光贴图的话这里就改成类型.  第21~22行这两个变量我们在后面要使用,所以声明一下和Properties中的关联.  第26行,我们在VertexOuput中多定义了一个变量,由于我们要计算视线向量,所以必须知道物体在世界空间中的位置(这个不一定,你可以在任何其他空间计算,只要参与计算的两个向量在一个空间就可以).  第35行,直接对模型空间的点左乘_Object2World矩阵转到世界空间就可以得到顶点在世界空间的位置了。  第45~47行为分别为漫反射,高光,环境光的反射系数赋值,注意高光与另外两者的区别.  第49行利用上面的环境光计算公式计算出环境光,其中UNITY_LIGHTMODEL_AMBIENT是Unity提供给我们直接获取场景中环境光颜色的变量.  第51~59行计算镜面反射公式中的facing,原理前面说过.  第60行利用镜面反射公式计算出高光颜色.有两点要注意,第一是给reflect函数传入射光的时候,传的不是反方向,而是真正的入射方向,所以要给我们之前方式计算出来的lightDir前面加个负号,第二点就是Cg中通过pow来计算指数,这个函数一般的语言都会提供,大家应该见过.  第61行把我们计算的漫反射,高光,环境光加在一起作为最终的颜色就可以了.
  (~ o ~)~系列教程的第四篇到此结束了,结合前一篇我们大致上对最基本的光照模型有了一些了解,下一篇也许会结合两者做一个实例,或者继续讲其他的地方,之后的内容可能会用到更多的数学原理和思考方法,其实Shader难得不是语法,难得是理解背后的真像,去探索背后的知识,我觉得比仅仅会使用要收获的更多。说实话,我不是一个随便的人,所以写帖子总是力求能写好,写透彻一些,这也让我每写一篇文章都要花费大量的时间,但这其中也让我自己在写教程的过程中能有所收获,发现自己理解不到位的地方,即使补充,如果这些内容能给大家带来一些启发,我也觉得我没有白写。谢谢大家的支持.  继续用上篇中的模型来大概展示一下效果.  
z1.jpg (74.51 KB, 下载次数: 9)
12:41 上传
  上面是使用上篇中漫反射的效果  
z2.jpg (80.35 KB, 下载次数: 3)
12:41 上传
  上面是使用了本篇课的ambient+diffuse+specular的效果.质感一下子就出来了,没有加高光贴图,要么会效果更好。unity 安卓弹出游戏后 unity shader绘制圆环;unity shader风沙效果; 镜面反射如何使用;u3d shaderlab实战 源码;unity .0 水下效果;unity sprites/diffuse 的unity如何通过shader获取物体在屏幕上的渲染范围;unity 反射;unity 真实反射;u3d 5.0 shader 打包;u3d shader 遮罩;u3d溶解安卓 不支持 u3镜面反射;unity汽车反射;unity 两点之间的距离;unity两点距离;unity 两点之间的角度;unity 求两向量的夹角
蛮牛币 +30
非常赞。这页面也比较清爽。
每日推荐:
4342/500排名<font color="#FF昨日变化3主题帖子积分
四处流浪, 积分 342, 距离下一级还需 158 积分
四处流浪, 积分 342, 距离下一级还需 158 积分
蛮牛币1343
在线时间76 小时
厉害。。。。。。。。。
每日推荐:
5749/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 749, 距离下一级还需 251 积分
熟悉之中, 积分 749, 距离下一级还需 251 积分
蛮牛币1095
在线时间193 小时
楼主加油,期待后面的内容!!!
每日推荐:
5749/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 749, 距离下一级还需 251 积分
熟悉之中, 积分 749, 距离下一级还需 251 积分
蛮牛币1095
在线时间193 小时
楼主,在写shader的过程中遇到过这样的问题,比如我定义片段函数的输入为v2f结构里,里面常常定义了uv坐标这个变量,在顶点函数里,求uv的方法我看过有两种,一种是o.uv = v.texcoord.一种是o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);这两种有什么区别呢?
每日推荐:
9排名<font color="#FF昨日变化3主题帖子积分
在线时间171 小时
楼主,在写shader的过程中遇到过这样的问题,比如我定义片段函数的输入为v2f结构里,里面常常定义了uv坐标 ...
一般用v.texcoord.xy就可以正常使用,有时候为了对原始UV进行一些偏移之类的操作就会使用一些我们在材质球的Inspector面板里为Texture赋的一个Vector值,而TRANSFORM_TEX是Unity提供的一个方法,让我们可以直接利用上指定的这个Vector值,如果你不用它的自己实现也是可以的,具体可看这篇文章说的比较清楚
.cn/s/blog_dayd.html
每日推荐:
5963/1000排名<font color="#FF昨日变化3主题帖子积分
熟悉之中, 积分 963, 距离下一级还需 37 积分
熟悉之中, 积分 963, 距离下一级还需 37 积分
蛮牛币2868
在线时间190 小时
& && && && && && && && && && && && && && && && && && && && && && && && && &&&棒棒的
每日推荐:
146/50排名<font color="#FF昨日变化24主题帖子积分
注册看看, 积分 46, 距离下一级还需 4 积分
注册看看, 积分 46, 距离下一级还需 4 积分
在线时间15 小时
牛逼···
每日推荐:
61009/1500排名<font color="#FF昨日变化主题帖子积分
蛮牛粉丝, 积分 1009, 距离下一级还需 491 积分
蛮牛粉丝, 积分 1009, 距离下一级还需 491 积分
蛮牛币3903
在线时间201 小时
好帖子必须支持
每日推荐:
61381/1500排名<font color="#FF昨日变化1主题帖子积分
蛮牛粉丝, 积分 1381, 距离下一级还需 119 积分
蛮牛粉丝, 积分 1381, 距离下一级还需 119 积分
蛮牛币4466
在线时间152 小时
感谢楼主分享~~~~~~~等更新~~~~~~~~
每日推荐:
143/50排名<font color="#FF昨日变化62主题帖子积分
注册看看, 积分 43, 距离下一级还需 7 积分
注册看看, 积分 43, 距离下一级还需 7 积分
在线时间20 小时
& && && && && && && &支持 and Mark一下~~~~~
每日推荐:
9排名<font color="#FF昨日变化5主题帖子积分
在线时间227 小时
大神下午好,shader的语法问题求教一下。看下面截取的一段代码
#pragma surface surf Lambert alphatest:_Cutoff
sampler2D _MainT
fixed4 _BackC
struct Input {
& & & & float2 uv_MainT
void surf (Input IN, inout SurfaceOutput o) {
& & & & fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color * _BackC
& & & & if( c.r == 0 && c.g == 0 && c.b == 0 && c.a == 1)
& & & & {//如果是全黑色并且不透明 将g通道加上1%的值以便投影抠图
& & & & & & & & c.g = 0.01;
& & & & o.Albedo = c.
& & & & o.Alpha = c.a;
我要问的是语法问题。这个surf是怎么传参的呢? in的结构体只是做了类型定义,并没有实际声明一个作为参数的对象,这个IN是怎传进去的?
它的返回值 inout出来的东西返回哪里了? 谁在调用这个函数?
每日推荐:
9排名<font color="#FF昨日变化3主题帖子积分
在线时间171 小时
大神下午好,shader的语法问题求教一下。看下面截取的一段代码
#pragma surface surf Lambert al ...
Surface Shader只是ShaderLab对V&FShader的一种封装,在实际编译的时候会被Unity解析成V&FShader。
之所以出现SurfaceShader,只是Unity为了替玩家简化渲染流程,把一些常用的功能或者代码替你完成。
SurfaceShader其实是可以自己写顶点着色器的, 默认不写Unity自动为你提供一个,在这个顶点着色器里面对完成对Input结构的计算填充,这个过程就对应V&F的顶点着色器,但语法上稍有不同。
而surf函数和Unity提供或者自定义的光照模型函数如Lambert,这两个部分实际上就相当于V&F里的fragmentShader。你在顶点着色器里计算的Input结构会自动传给surf,surf算出来一个SurfaceOutput再传给指定的光照模型函数,最终光照模型函数返回计算的颜色结果。。
大概就是这个意思了。
要是还不明白,可以去看看悄悄同学在Blog里面写过的一篇对SurfaceShader剖析的文章。很详细。
每日推荐:
9排名<font color="#FF昨日变化5主题帖子积分
在线时间227 小时
最近在学着色器,能加个qq吗?我的是
每日推荐:
71680/5000排名<font color="#FF昨日变化15主题帖子积分
日久生情, 积分 1680, 距离下一级还需 3320 积分
日久生情, 积分 1680, 距离下一级还需 3320 积分
蛮牛币2166
在线时间230 小时
赞,学习一下,谢谢分享
每日推荐:
经过游戏蛮牛认证的蛮牛小翻译
游戏蛮牛QQ群会员
加入游戏蛮牛官方QQ群
购买游戏蛮牛书籍
连续签到30天
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号专业挖坑,业余搬运
视频地址复制
Flash地址复制
Html地址复制
离线看更方便
用或其他应用扫描二维码
/watch?v=fD_ho_ofY6A Unity官方教程,搬运自youtube。本视频一切权益属于原作者:Unity5官方团队
如有有志向于传播Unity教程,愿意挺身而出制作字幕/后期的同学(边学边传)请私信我。[]~( ̄▽ ̄)~*
这个视频很好地介绍了unity5的标准着色器语言,非常适合初学者!
广播电视节目制作经营许可证:(沪)字第1248号
| 网络文化经营许可证:沪网文[6号 | 信息网络传播视听节目许可证:0910417 | 互联网ICP备案:沪ICP备号-3 沪ICP证:沪B2- | 违法不良信息举报邮箱: | 违法不良信息举报电话:转3查看: 2047回复: 28
Unity实时反射——AngryBots示例项目地面实时反射效果剖析
元素币活跃度贡献值
unity3D区版主
土豪金2176
在线时间4078 小时
马上注册成为元素者,获取海量元素资源,结识各路大神级人物
才可以下载或查看,没有帐号?
Angry Bots是Unity安装程序自带的开源示例项目。该示例项目虽然已经发布很久了,但是其很多设计和实现仍然具有参考价值。运行该项目仔细观察,可以发现其雨天地面效果是实时反射的。这里我们先阐明实时反射的原理,然后分析其绘制流程。
构造反射相机视图矩阵  反射相机的视图矩阵由反射矩阵变换得到,反射矩阵由反射平面确定,下面列出反射矩阵推导过程。反射位置
f40c96f205ed4a95afaa3e.001..png (10.7 KB, 下载次数: 0)
15:48 上传
f40c96f205ed4a95afaa3e.002..png (47.17 KB, 下载次数: 0)
15:48 上传
f40c96f205ed4a95afaa3e.003..png (11.85 KB, 下载次数: 0)
15:48 上传
f40c96f205ed4a95afaa3e.004..png (73.27 KB, 下载次数: 0)
15:49 上传
M1*M2即得到示例代码所示的反射矩阵。
static Matrix4x4 CalculateReflectionMatrix(Matrix4x4 reflectionMat, Vector4 plane)
{
& & reflectionMat.m00 = (1.0F - 2.0F * plane[0] * plane[0]);
& & reflectionMat.m01 = (-2.0F * plane[0] * plane[1]);
& & reflectionMat.m02 = (-2.0F * plane[0] * plane[2]);
& & reflectionMat.m03 = (-2.0F * plane[3] * plane[0]);
& & reflectionMat.m10 = (-2.0F * plane[1] * plane[0]);
& & reflectionMat.m11 = (1.0F - 2.0F * plane[1] * plane[1]);
& & reflectionMat.m12 = (-2.0F * plane[1] * plane[2]);
& & reflectionMat.m13 = (-2.0F * plane[3] * plane[1]);
& & reflectionMat.m20 = (-2.0F * plane[2] * plane[0]);
& & reflectionMat.m21 = (-2.0F * plane[2] * plane[1]);
& & reflectionMat.m22 = (1.0F - 2.0F * plane[2] * plane[2]);
& & reflectionMat.m23 = (-2.0F * plane[3] * plane[2]);
& & reflectionMat.m30 = 0.0F;
& & reflectionMat.m31 = 0.0F;
& & reflectionMat.m32 = 0.0F;
& & reflectionMat.m33 = 1.0F;
& &return reflectionM
[align=left]}复制代码其中代码中4维数组plane存的是点法线式平面方程的参数。
  反射相机的投影矩阵并非常规的投影矩阵,反射面上的斜投影面才是反射相机真正的投影面,
所以需要用斜投影面代替掉常规的投影面。示例代码中给出了斜投影矩阵,
原理和推导过程参看本文末尾给出的参考文献链接。这里给出示意图:
f40c96f205ed4a95afaa3e.006..png (23.55 KB, 下载次数: 0)
15:49 上传
绘制流程 
1.创建反射摄像机reflectionCamera,reflectionCamera默认disable,用一张RenderTexutre来保存reflectionCamera绘制的结果,用来在之后的shader里采样。
reflectCamera.enabled =& && && && && && && && && && && && && &&&
reflectCamera.targetTexture = CreateTextureFor(cam);复制代码
private RenderTexture CreateTextureFor(Camera cam)
{

& && && && &&&RenderTexture rt = new RenderTexture(Mathf.FloorToInt(cam.pixelWidth * rtSizeMul), Mathf.FloorToInt(cam.pixelHeight * rtSizeMul), 24, rtFormat);& && && && && && && && && && && && && &&&
& && && && &&&rt.hideFlags = HideFlags.DontS
& && && && &&&
}复制代码
2.在LateUpdate中根据当前摄像机去构造反射摄像机变换矩阵,涉及到反射面reflectiveSurface的选取,示例中是选取合适的路面做反射面,然后手动调用绘制,绘制前设置前面剔除,绘制完置回。
private void RenderReflectionFor (Camera cam, Camera reflectCamera)
{

& & //构造反射平面
& &&&Vector3 pos = reflectiveSurface.transform.
& && && && &&&pos.y = reflectiveSurface.position.y;
& && && && &&&Vector3 normal = reflectiveSurface.transform.
& && && && &&&float d = -Vector3.Dot(normal, pos) - clipPlaneO
& && && && &&&Vector4 reflectionPlane = new Vector4(normal.x, normal.y, normal.z, d);
& && && && &
& & //构造反射视图矩阵& && && && && && && && && && && && && &&&
& && && && &&&Matrix4x4 reflection = Matrix4x4.
& && && && &&&reflection = CalculateReflectionMatrix(reflection, reflectionPlane);
& & //得到反射摄像机位置& && && && && && && && && &
& && && && &&&oldpos = cam.transform.
& && && && &&&Vector3 newpos = reflection.MultiplyPoint (oldpos);
& && && && && && &
//得到反射摄像机视图矩阵& && && && && && && && && && && && && &&&
& && && && &&&reflectCamera.worldToCameraMatrix = cam.worldToCameraMatrix *
& && && && &
//得到反射摄像机投影矩阵& && && && && && && && && && && && && &&&
& && && && &&&Vector4 clipPlane = CameraSpacePlane(reflectCamera, pos, normal, 1.0f);
& && && && && && && && && && && && && && && && && && &
& && && && &&&Matrix4x4 projection =&&cam.projectionM
& && && && && && && && && & projection = CalculateObliqueMatrix(projection, clipPlane);
& && && && && && && && && & reflectCamera.projectionMatrix =
& && && && && && && && && &
& && && && &&&…
GL.SetRevertBackfacing(true);& && && && &
reflectCamera.RenderWithShader (replacementShader, &Reflection&);& && && && && && && && && && && && && &&&
GL.SetRevertBackfacing(false);
}复制代码Shader  反射面的材质接受反射相机绘制好的RenderTexture做为贴图对其采样。
示例中的反射面——地面shader增加了uv扰动参数和噪声贴图用来达到扭曲效果,
还叠加了一个水花效果,这样的话使得雨天地面反射更加真实,而不是干净得像一面镜子。
v2f_full vert (appdata_full v)
{
& && && && &&&…& && && && && && && && && && && && && &&&
// uv坐标扰动,随时间变化
& && && && &&&o.normalScrollUv.xyzw = v.texcoord.xyxy * _TexAtlasTiling + _Time.xxxx * _DirectionUv;
& && && && &
//经验算法?!生成UV取水花贴图& && && && && && && && && && && && && && && && && && && && && && &&&
half3 worldSpace = mul(_Object2World, v.vertex).
worldSpace = (-_WorldSpaceCameraPos * 0.6 + worldSpace) * 0.07;
o.fakeRefl =&&worldSpace.& && && && && && && && && &
& && && && && && && && && &
& && && && &&&
}
fixed4 frag (v2f_full i) : COLOR0
{
& && && && &&&fixed4 nrml = tex2D(_Normal, i.normalScrollUv.xy);
& && && && &&&nrml = (nrml - 0.5) * 0.1;
& && && && &
//UV扰动,在RenderTexture采样& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
& && && && &&&fixed4 rtRefl = tex2D (_ReflectionTex, (i.screen.xy / i.screen.w) +nrml.xy);
& && && && && && && && && && && && && && &
& && && && &&&//叠加上在水花贴图
& && && && &&&rtRefl += tex2D (_FakeReflect, i.fakeRefl + nrml.xy);
& && && && &
& && && && &&&//原贴图颜色& && && && && && && && && && && && && && && && && && &
& && && && &&&fixed4 tex = tex2D (_MainTex, i.uv);
& && && && &
//SrcAlpha One混合模式叠加& && && && && && && && && &
& && && && &&&tex&&= tex + tex.a * rtR
& && && && && && && && && && && && && && &
& && && && &&&
}复制代码
效果附School项目按示例方式添加雨水地面实时反射效果前后对比图:
f40c96f205ed4a95afaa3e.007..png (314.44 KB, 下载次数: 0)
15:40 上传
f40c96f205ed4a95afaa3e.008..png (345.07 KB, 下载次数: 0)
15:40 上传
参考链接:http://fp.optics.arizona.edu/optomech/Fall13/Notes/6%20Mirror%20matrices.pdf/lengyel/Lengyel-Oblique.pdf
元素币 +10
活跃度 +10
元素币活跃度贡献值
元素皇, 积分 52215, 距离下一级还需 47785 积分
元素皇, 积分 52215, 距离下一级还需 47785 积分
土豪金1373
在线时间303 小时
高端大气上档次
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
土豪金17841
在线时间2069 小时
强大,谢谢分享& && && &&&
时间可以证明一切
元素币活跃度贡献值
元素王, 积分 23258, 距离下一级还需 6742 积分
元素王, 积分 23258, 距离下一级还需 6742 积分
在线时间382 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
unity3D区版主
土豪金1943
在线时间1373 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 21095, 距离下一级还需 8905 积分
元素王, 积分 21095, 距离下一级还需 8905 积分
在线时间382 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 1801, 距离下一级还需 199 积分
元素侠, 积分 1801, 距离下一级还需 199 积分
在线时间18 小时
哈哈哈哈哈哈哈
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 69391, 距离下一级还需 30609 积分
元素皇, 积分 69391, 距离下一级还需 30609 积分
在线时间1379 小时
好资源~!点赞
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 7904, 距离下一级还需 22096 积分
元素王, 积分 7904, 距离下一级还需 22096 积分
在线时间130 小时
感谢分享{:1_144:}
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 1801, 距离下一级还需 199 积分
元素侠, 积分 1801, 距离下一级还需 199 积分
在线时间18 小时
灌灌灌灌灌灌灌灌灌
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 8104, 距离下一级还需 21896 积分
元素王, 积分 8104, 距离下一级还需 21896 积分
在线时间19 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素师, 积分 459, 距离下一级还需 41 积分
元素师, 积分 459, 距离下一级还需 41 积分
在线时间6 小时
高端大气上档次
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4257, 距离下一级还需 743 积分
元素魔, 积分 4257, 距离下一级还需 743 积分
在线时间54 小时
即时经典侠MMORPG手机游戏
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4257, 距离下一级还需 743 积分
元素魔, 积分 4257, 距离下一级还需 743 积分
在线时间54 小时
即时经典侠MMORPG手机游戏
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4257, 距离下一级还需 743 积分
元素魔, 积分 4257, 距离下一级还需 743 积分
在线时间54 小时
即时经典侠MMORPG手机游戏
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 18825, 距离下一级还需 11175 积分
元素王, 积分 18825, 距离下一级还需 11175 积分
在线时间319 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 1975, 距离下一级还需 25 积分
元素侠, 积分 1975, 距离下一级还需 25 积分
在线时间17 小时
啊啊啊啊啊啊
活跃度 -20
这么水可不好哦.~论坛提供了便捷回复呢
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4061, 距离下一级还需 939 积分
元素魔, 积分 4061, 距离下一级还需 939 积分
在线时间56 小时
学习了。我知道的是添加反射探测头,但是不能反射周围物体。。还有别的方法解决嘛?
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 16617, 距离下一级还需 13383 积分
元素王, 积分 16617, 距离下一级还需 13383 积分
在线时间213 小时
根本看不懂啊,还是支持下,谢谢分享
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 13679, 距离下一级还需 16321 积分
元素王, 积分 13679, 距离下一级还需 16321 积分
在线时间250 小时
效果很高大上,虽然很想细入研究,但这向量题看得我头昏眼花
还没有设置签名!您可以在此展示你的链接,或者个人主页!
【拥有1000元素币】你就可以领取
【拥有3000元素币】其实也是很容易的事情
【1W元素币】的持有者,对于很多元素者来说,是一件值得骄傲的事情!
【5W元素币】的持有者是真的土豪!赶快用它做点什么吧!
达成成就【元素贤者】在元素知道
超过20次解决提问者的问题
达成成就【我是界王】在任意元素QQ群联盟,到达【界王】以上
限量版珍贵徽章,参与元素特定活动,元素T恤获取者
元素【鼓励师】职业标志,从此走上了不一样的巅峰之路。元素鼓励师,一句你就湿!
【元素晶石】
只有【元素大神】才能拥有,自由出入元素秘境之钥
【真爱之花】
情人节限量版,据说此花会带来桃花运!
平时一次性兑换土豪金超过3000,圣诞节期间一次性兑换土豪金超过500即可获取!
一把常见的矿镐,往元素矿场投入2000元素币获取
升级到【矿脉·勘探者】
守望者【赤炼】
守望者lewis的强大武器
加入【元素1年】自古美女爱英雄,这是千年不变的定律!英雄盾会为你们见证
升级到【星球·资源帝】
达成成就【元素皇者】升级成为元素皇
达成成就【皇室后裔】最先成为元素皇的30个人,或者土豪逆袭获取
达成成就【元素之神】升级成为元素神
天降异火,大菠萝曾经火过,直接获取任何一个售价低于6000元素币的资源
达成成就【一代宗师 】发布过50张以上的教程类资源
【拥有10W元素币】才可以获得,您已经富可敌国了,钱对你来说只是一个数字,没有任何别的意义!
达成成就【中级追猎者】在元素悬赏中30次被评为最佳答案 ,双十二特别礼品
【MP50】这次的冒险才刚刚开始,和所有故事一样,你得先有一个属于自己的法杖!即使他的法力会在30天后消失
达成成就【元素智者】在元素知道
超过5次解决提问者的问题
守望者【猎空】
据说可以随时呼唤猎空,需要消耗100点贡献
加入【元素6月】在元素冒险的时候,你一定会用到它,尤其是在遇到像小强这种可怕生物时
【50小时】的学习,已经证明了你自己,这件法袍是你的了,由于使用了简陋的材料,能穿一个月已经不错了!
【600小时】在线,足以驾驭魔神的力量,他们会守护你!
达成成就【闪电链】发布55张包含3条以上内部相关链接的帖子
元素推荐-友情提示 /1
每周一次的扩散大招带来更多元素币收益!
快速登录:
收藏帖子(6)
周一至周日:08:00-22:00
积分和充值
&2014&&. All rights reserved. (

我要回帖

更多关于 unity 实时反射 的文章

 

随机推荐