找回密码
 立即注册
查看: 4193|回复: 101

[特效Shader] Unity3D中如何实现反射教程

[复制链接]
发表于 2012-12-30 21:45 | 显示全部楼层 |阅读模式
资源信息 Tutorial Information
教程名称: Unity3D中如何实现反射教程(发帖教程)
适用引擎:   (适用引擎,为空默认为Unity)
教程语种: 中文
教程等级: 1
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
下载地址: (兑换积分)
点击查看原图
美丽分割线

一.

float d = -Vector3.Dot (normal, pos) - m_ClipPlaneOffset; //原点到平面的距离

//可通过m_ClipPlaneOffset调整物体与反射物体之间的缝隙。

Vector4 reflectionPlane = new Vector4 (normal.x, normal.y, normal.z, d); //定义反射平面



备注:线性代数之平面
平面方程:Ax + By + Cz + w = 0;

这个方程的意义,可以看成两个向量的点击 N(A,B,C) V(x,y,z), N.dot(V) = -w; 向量N是一个常量向量,向量V代表一类向量。N可以看成平面的单位法向量,V可以看成平面上的点和原点的连线向量。则此时的w就有了特殊含义:原点到平面的距离。

如下图, N.dot(V) = A*x + B*y + C*z = |N| * |V| * cos(angle) = |V| * cos(angle) = distance;

角度angle为平面法线和向量V的夹角。

所以平面方程可以表示为法向量和距离的二元组。

plane = <Normal, distance>






更多延伸link

二.

   Matrix4x4 reflection = Matrix4x4.zero;
   CalculateReflectionMatrix (ref reflection, reflectionPlane); //通过反射平面生成反射矩阵
   Vector3 oldpos = cam.transform.position;
   Vector3 newpos = reflection.MultiplyPoint( oldpos ); //通过反射矩阵变换观察相机位置得到反射相机位置
   reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection; //通过反射矩阵变换观察相机世界矩阵生成反射相机世界矩阵

三.

   Vector4 clipPlane = CameraSpacePlane( reflectionCamera, pos, normal, 1.0f );  //生成反射相机裁剪平面
   Matrix4x4 projection = cam.projectionMatrix;
   CalculateObliqueMatrix (ref projection, clipPlane); //通过观察相机投影矩阵与裁剪平面生成非对称投影矩阵给反射相机
   reflectionCamera.projectionMatrix = projection;

四.

   GL.SetRevertBackfacing (true); //开启背面显示
   reflectionCamera.transform.position = newpos;
   Vector3 euler = cam.transform.eulerAngles;
   reflectionCamera.transform.eulerAngles = new Vector3(-euler.x, euler.y, euler.z);
   reflectionCamera.Render(); //渲染反射相机的内容到rtt
   reflectionCamera.transform.position = oldpos;
   GL.SetRevertBackfacing (false); //关闭背面显示



shader中通过ComputeScreenPos()直接生成投影坐标,在用tex2Dproj()采样即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1鲜花 +1 收起 理由
sea + 1 赞一个!

查看全部评分

发表于 2016-12-19 11:11 | 显示全部楼层

感谢楼主的无私分享!
发表于 2017-2-12 13:45 | 显示全部楼层
好帖就是要顶
发表于 2017-2-12 13:05 | 显示全部楼层
真心顶
发表于 2017-2-12 13:41 | 显示全部楼层
难得一见的好帖
发表于 2017-2-12 13:04 | 显示全部楼层
很好哦
发表于 2017-2-12 13:15 | 显示全部楼层
LZ真是人才
发表于 2017-3-2 20:39 | 显示全部楼层
很不错
发表于 2017-3-2 21:06 | 显示全部楼层
难得一见的好帖
发表于 2017-3-2 21:25 | 显示全部楼层
说的非常好
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-25 18:58 , Processed in 0.108760 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表