Unity3D surf 函数,简单折射
2016-02-28 13:44
417 查看
Refration - 折射
struct Input { float2 uv_MainTex; float2 uv_BumpMap; float3 viewDir; //因为这里使用了Normal map,所以要使用INTERNAL_DATA float3 worldRefl ; float3 worldNormal; INTERNAL_DATA }; samplerCUBE _Cubemap; float _ReflAmount; fixed4 _Color; void surf (Input IN, inout SurfaceOutput o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; //如果不使用Normal map的话,是可以直接操作Normal和viewDir的,但是一旦改变了Normal //就必须用WorldNormalVector 和 WorldReflectionVector 来做法线和反射向量。 //o.Normal = -o.Normal; //IN.viewDir = -IN.viewDir; //因为使用了Normal map,所以下面的操作就必须基于WorldNormalVector和WorldReflectionVector //特别要注意的是,此时除了o.Normal之外,是万万不能使用了IN.viewDir的,因为IN.viewDir的参考系也变了 o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)).rgb; /* 这个是求折射的 其中需要注意的是折射光线的求法。 此处是用 ref向量 减去 1.3倍的Normal来做的。 这个系数1.2很关键,说的理论一点是用来控制折射率的。 从肉眼看就是物体是水、玻璃、钻石的区别 实际上这个系数不同取值范围有不同的物理含义: 当其大于1的时候,表示obj介质密度大于camera介质密度。 当其在0.5到1之间,表示obj介质密度小于camera介质密度。(譬如水中看气泡) 当其小于0.5的时候,就不是折射而是反射了。 */ float3 back = 0.9*texCUBE(_Cubemap, normalize( -1.2* WorldNormalVector( IN, o.Normal) + 1* WorldReflectionVector (IN, o.Normal)) ).rgb*_ReflAmount; //很简单的改动Normal后的求反射光线的做法 float3 front = 0.3 * texCUBE(_Cubemap, WorldReflectionVector ( IN, o.Normal)).rgb*_ReflAmount; o.Emission = back + front ; o.Alpha = c.a; }
相关文章推荐
- Unity3D 5 官方教程:SpeedTree/LOD Trees
- unity发布网页版(内嵌网页)
- unity2d角色防止二段跳解决方案
- Unity定时器
- Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。
- 关于Unity碰撞和触发的总结
- 菜鸟在线Unity3d教程:如何获取摄像机图像?
- 菜鸟在线教你用Unity3D开发VR版的Hello World
- unity3d各种OpenFileDialog操作和Win MessageBox
- Unity IOS端 注意点
- 将NGUI的坐标转换Unity中的世界坐标
- 《Unity_API解析》 第四章 HideFlags类
- Unity3d本地存储
- 《Unity_API解析》 第三章 GameObject类
- [置顶] unity中制作序列帧动画
- [置顶] Unity中基于NGUI插件制作序列帧动画
- 碰撞检测之Ray-Capsule检测
- Unity3d MonoBehaviour 的可重写函数整理
- Unity3d中的属性(Attributes)整理
- Share 学习二:Unity shader 的组织形式