




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在上一篇文章中,我们通过自定义着色器实现了一个简单的在3D游戏中选取、显示物体轮廓的实例。更多精彩请关注 【狗刨学习网】 在文章最后,给大家留下了一个问题,就是我们的这种方 法存在一定的问题,无法运用到复杂的模型上。原因是什么呢?这要从这种方法的原理上来说, 其实这种方法类似于摄像机的视角方向上对物体进行了一个投影。这样的话,如果模型被其它物体遮挡的话,就会岀现渲染不完全的问题,如图所示,有一位朋友在评论中提岀了这个问题。那么,怎么解决这个问题呢?对于遮挡的问题,我们一般采取的方法是拉近摄像机,因此,我们这里依然采取这种方法,即如果被渲染的物体前面有遮挡物体,则将摄像机拉近,这样就可以解决这个
2、问题了。那么解决了上一篇文章中的问题后,我们就来开始学习今天的内容一一 开发复杂模型的选取与轮廓高亮显示。首先,我们今天的内容是基于边缘光来实现的,在 Unity3D的官方示例中,我们可以找到这个算法,其核心算法是:Unity3D 游戏(RimLight)的方法1. vfont face=" 新宋体" size="2">halfrim1.0saturate(dot(normalize(IN.viewDir), IN.worldNormal);2. o.Emission = _RimColor.rgb * pow (rim, _RimPower);
3、</font>复制代码其中,IN.viewDir 是当前视角向量,IN.worldNormal 是物体的法线。dot是计算视角和法线的 点积,等于视角和法线夹角的cos值,如下图:由于Cos的值域是1到0,所以1-cos就成了 0到1,在夹角90度时达到最大值,正好 用来模拟侧光的强度(与视角成90度的部分光线最强,就是边缘光了),把这个值的变化率用一个pow函数(rim的_rimPower次方)进行放大,就能强化边缘发亮的效果。但是当物体表面比 较平直时(例如立方体),由于各个面上的法向量都是一个方向上的,因此无法体现岀变化和轮廓。此外,这种方法在描绘凹的几何体时,凹的部分(包括
4、法线贴图造成的凹凸)的边缘也都会被画岀来,并不是真正意义上的边缘轮廓,就是一种侧光效果。好了,下面我们开始具体地来讲通过这种方法来实现物体轮廓高光显示。首先编写Shader:1. vfont face="新宋体"size="2">Shader "Custom/Outline" 2. Properties 3. _Color ("Main Color", Color) = (1,1,1,1)4. _SpecColor ("Specular Color", Color) = (0.5, 0.5
5、, 0.5, 1)5. _Shininess ("Shininess", Range (0.03, 1) = 16. _MainTex ("Base (RGB) Gloss (A)", 2D) = "black" 7. _BumpMap ("Normalmap", 2D) = "bump" 8. /边缘光颜色9. _RimColor ("Rim Color", Color) = (0,0,0,0.0)10. /放大倍数11. _RimPower ("Rim Powe
6、r", Range(0.5,8.0) = 2.012. 13. SubShader 14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.Tags "RenderType"="Opaque" LOD 400CGPROGRAM#pragma surface surf BlinnPhong#pragma target 3.0 sampler2D _MainTex;sampler2D _Bu
7、mpMap; fixed4 _Color;half _Shininess;float4 _RimColor;float _RimPower;struct Input float2 uv_MainTex;float2 uv_BumpMap;float3 viewDir;void surf (Input IN, inout SurfaceOutput o) fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);o.Albedo = tex.rgb * _Color.rgb;o.Gloss = tex.a;o.Alpha = tex.a * _Color.a;o.S
8、pecular = _Shininess;o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap);/核心算法half rim = 1 - saturate(dot (normalize(IN.viewDir), o.Normal);o.Emission = _RimColor.rgb * pow (rim, _RimPower);ENDCG50. FallBack "Specular"51. </font>复制代码在这个着色器脚本中,最重要的一个属性是_RimColor,这个值将决定我们最终渲染的效果。在上一
9、篇文章中,我们是通过一个使用了自定义着色器的材质来实现轮廓显示的,今天我们换一种方法,怎么做呢?我们这里通过 Shader来实现,在 Material中有一个 Shader属性,一 旦改变了该属性的值,那么所有材质都将按照新的渲染方式进行渲染。我们在上一篇文章中的脚本的基础上,扩展得到下面的脚本:1. vfont face=" 新宋体"size="2">using UnityEngine;2. using System.Collections;3. public class ShowBoundry : MonoBehaviour 4. /使用显示轮
10、廓的简单材质5. public Material mSimpleMat;6. /默认材质7. public Material mDefaultMat;8. / 我们今天使用Shader来直接改变模型的渲染效果,这样可以避免使用一个材质9. public Shader RimLightShader;10. public Color RimColor = new Color(0.2F,0.8F,10.6F,1);11. / 定义私有变量以存储模型的原始信息12. private SkinnedMeshRenderer mSkin;13. private Color mColor;14. priva
11、te Shader mShader;15. void Start ()|16. 17. /获取模型的 SkinnedMeshRenderer18. mSkin=GameObject.Find("Person").19. GetComponentInChildren();20. /获取默认颜色21. mColor=mSkin.material.color;22. /获取默认Shader23. mShader=mSkin.material.shader;24. 25. void Update ()26. 27.28.29.30.31.32.33.34.35.36.37.38.3
12、9.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59./获取鼠标位置Vector3 mPos=lnput.mousePosition;/向物体发射射线Ray mRay=Camera.main.ScreenPointToRay(lnput.mousePosition);RaycastHit mHit;/射线检验|if(Physics.Raycast(mRay,out mHit)/Cubeif(mHit.collider.gameObject.tag="Cube")/将当前选中的对象材质换成带轮廓线的材质mH
13、it.collider.gameObject.renderer.material=mSimpleMat;/将未选中的对象材质换成默认材质|GameObject.Find("Sphere").renderer.material=mDefaultMat;/将模型恢复到初始状态mSkin.material.shader=mShader;mSkin.material.SetColor("_RimColor",mColor);/设置提示信息GameObject.Find("GUIText").guiText.text="是:Cube&
14、quot;/Sphere|if(mHit.collider.gameObject.tag="Sphere")/将当前选中的对象材质换成带轮廓线的材质mHit.collider.gameObject.renderer.material=mSimpleMat;/将未选中的对象材质换成默认材质|GameObject.Find("Cube").renderer.material=mDefaultMat;/将模型恢复到初始状态mSkin.material.shader=mShader;|mSkin.material.SetColor("_RimColor
15、",mColor);/设置提示信息GameObject.Find("GUIText").guiText.text="当前选择的对象当前选择的对象是:Sphere"61. /Person62. if(mHit.collider.gameObject.tag="Person")63. 64. /更换 Shader |65. mSkin.material.shader=RimLightShader;66. mSkin.material.SetColor("_RimColor",RimColor);67. /将未
16、选中的对象材质换成默认材质68. GameObject.Find("Cube").renderer.material=mDefaultMat;69. GameObject.Find("Sphere").renderer.material=mDefaultMat;70. /设置提示信息71. GameObject.Find("GUIText").guiText.text="当前选择的对象是:Person"72. 73. 74. 75. </font>复制代码在今天的脚本中,我们增加了一个RimLightShader和RimColor,它们的作用是指定着色器和边缘光的颜色,我们可以通过外
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运动营养咨询师岗位面试问题及答案
- 市场数据分析专家岗位面试问题及答案
- 江苏省苏州市第五中学校2025届化学高二下期末质量跟踪监视试题含解析
- 2025届四川省成都实验高级中学化学高一下期末统考模拟试题含解析
- 杭州禽类交易管理办法
- 发票管理办法开具发票
- 村镇规划果园管理办法
- 区域医师注册管理办法
- 核算岗位电价管理办法
- 小区物业管理制度监督考核方案
- 期末教师会议校长精彩讲话:最后讲了存在的问题
- 知名连锁汉堡店食安QSC稽核表
- 摄影设备采购合同范例
- DB41T 1812-2019 苹果简约栽培技术规程
- 【《三只松鼠公司员工激励现状调查及优化建议(附问卷)14000字》(论文)】
- 护理不良事件登记本及护理不良事件报告新规制度
- 农业土壤检测技术行业发展前景及投资风险预测分析报告
- 广东省深圳市罗湖区2023-2024学年二年级下学期期末考试数学试题
- 长沙新华书店面试题目
- 秒懂艺术那些事智慧树知到期末考试答案章节答案2024年商丘师范学院
- (中考试题)2024年浙江省湖州市中考数学真题-附解析
评论
0/150
提交评论