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

拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(f663a-ua98).
重新安装浏览器,或使用别的浏览器Unity3D教程:教你如何利用Shader来进行3D角色的渲染 | Unity3D教程手册
当前位置 :
>> Unity3D教程:教你如何利用Shader来进行3D角色的渲染
Unity3D教程:教你如何利用Shader来进行3D角色的渲染
本文主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader。
一、从Shader开始
1、通过Assets-&Create-&Shader来创建一个默认的Shader,并取名“MyShader”。
Unity3D教程:3D角色的渲染
2、将MyShader打开即可看见Unity默认的Shader代码
&&&01Shader &Custom/MyShader& {02Properties {03_MainTex (&Base (RGB)&, 2D) = &white& {}04}05SubShader {06Tags { &RenderType&=&Opaque& }07LOD 20008CGPROGRAM09#pragma surface surf Lambert10sampler2D _MainTex;11struct Input {12float2 uv_MainTex;13};14void surf (Input IN, inout SurfaceOutput o) {15half4 c = tex2D (_MainTex, IN.uv_MainTex);16o.Albedo = c.rgb;17o.Alpha = c.a;18}19ENDCG20}21FallBack &Diffuse&22}
3、将该Shader赋给一个角色,就可以看到该Shader所能表达出的Diffuse渲染效果。
Unity3D教程:3D角色的渲染
4、接来我们将以此默认Shader作为蓝本,编写出自定义的Shader。另外,该Shader所用到的参数,我们将在下一章节进行说明。
二、实现多种自定义渲染效果
1、 BumpMap效果
如果想实现Bump Map效果,可对上述的Shader做如下修改:
1.1 在属性Properties中加入:
&&&1Properties {2_MainTex (&Base (RGB)&, 2D) = &white& {}3_BumpMap(&Bumpmap&, 2D) = &bump& {}4}
1.2 在SubShader的变量中也进行相应修改:
&&&1sampler2D _MainTex;2sampler2D _BumpMap;3struct Input {4float2 uv_MainTex;5float2 uv_BumpMap;6};
1.3 最后修改surf函数,加入对Normal分量的计算:
&&&1void surf (Input IN, inout SurfaceOutput o) {2&white-space:&& half4 c = tex2D (_MainTex, IN.uv_MainTex);3o.Albedo = c.rgb;4o.Alpha = c.a;5o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));6}
这样,角色的材质部分即可变为如下形式(暂定BumpMap的Shader名为“MyShader1”):
Unity3D教程:3D角色的渲染
然后,根据Base图来创建其Normal Map图,并拖入到BumpMap中即可。BumpMap的效果显示如下:
Unity3D教程:3D角色的渲染
(1)首先是title的解释
&&&1Shader &Custom/MyShader1&
这种表示表明了该Shader在编辑器中的显示位置,例如我们可在如下地方找到该Shader。
Unity3D教程:3D角色的渲染
(2)其次是Properties
&&&1Properties {2_MainTex (&Base (RGB)&, 2D) = &white& {}3_BumpMap(&Bumpmap&, 2D) = &bump& {}4}
Properties可通过如下语义进行声明:
name ("displayname", property type) = default value
“name” 是与Shader脚本中对应的名字
“display name”是在材质视图中所显示的名字
“propertytype”是指该property的类型,一般可有如下几种类型:Range,Color,2D,Rect,Cube,Float和Vector
“defaultvalue”是指该property的默认值
这里需要注意的是,如果你在Properties中加入了新的属性,那么你需要在CGPROGRAM中的SubShader中加入同样名字的参数。
(3)接下来是“LOD”语义词的解释。
这里的“LOD”主要是指Shader的LOD程度,即对于超出该范围的物体将不再通过该Shader进行渲染,具体的Shader LOD说明可以参见:
(4)我们在SubShader中还加入了
&&&1sampler2D _BumpMap;2float2 uv_BumpMap;
其中,_BumpMap是为了关联Properties中的_BumpMap属性。
而uv_BumpMap,是为了获取BumpMap图中的uv坐标。
(5)最后,我们在surf函数中获取每个顶点的纹理信息以及法线信息,这些信息将被应用于接下来的Vertex Fragment和Pixel Fragment。
&&&1void surf (Input IN, inout SurfaceOutput o) {2half4 c = tex2D (_MainTex, IN.uv_MainTex);3o.Albedo = c.rgb;4o.Alpha = c.a;5o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));6}
其中,tex2D函数可以读取纹理_MainTex中的IN.uv_MainTex坐标位置的像素颜色值。
Albedo和Alpha分别获取该像素的RGB值和Alpha值,其中“Albedo”是一个漫反射参数,它表示一个表面的漫反射能力,即一个表面上出射光强与入射光强的比值。具体介绍可见:。
2、& Blinn-Phong效果
如果想实现Blinn-Phong效果,可对上述的Shader做如下修改:
2.1&&在属性Properties中加入:
&&&1_AmbientColor (&Ambient Color&, Color) = (0.1, 0.1, 0.1, 1.0)2_SpecularColor (&Specular Color&, Color) = (0.12, 0.31, 0.47, 1.0)3_Glossiness (&Gloss&, Range(1.0,512.0)) = 80.0
2.2&&在SubShader的变量中也加入相应修改:
&&&1fixed4 _AmbientColor;2fixed4 _SpecularColor;3half _Glossiness;
2.3&&最后修改surf函数,进行如下修改:
&&&1fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
这里将原有的half4替换为fixed4,这样做是为了提高渲染的性能,因为fixed的精度较之half要低,更高的精度意味着更大的计算量,而这里fixed的精度已经足够,所以使用fixed替代half4,从而来降低计算消耗,增加渲染性能。
2.4&&将“#pragma surface surf Lamber”改成“#pragma surfacesurf CustomBlinnPhong”,同时加入与其对应的LightingCustomBlinnPhong函数来计算顶点光照。
&&&01inline fixed4 LightingCustomBlinnPhong (SurfaceOutput s, fixed3 lightDir, fixed3 viewDir, fixed atten) 02{03fixed3 ambient = s.Albedo * _AmbientColor.rgb;04&05fixed NdotL = saturate(dot (s.Normal, lightDir)); 06fixed3 diffuse = s.Albedo * _LightColor0.rgb * NdotL;07&08fixed3 h = normalize (lightDir + viewDir); 09float nh = saturate(dot (s.Normal, h)); 10float specPower = pow (nh, _Glossiness);11fixed3 specular = _LightColor0.rgb * specPower * _SpecularColor.rgb;12&13fixed4 c;14c.rgb = (ambient + diffuse + specular) * (atten * 2);15c.a = s.Alpha + (_LightColor0.a * _SpecularColor.a * specPower * atten);16return c;17}
该函数的名称为什么不是“CustomBlinnPhong”呢?这是因为该函数虽然是由“#pragma surface surf CustomBlinnPhong”来调用,但是为了让该函数可以正常工作,我们需要在其名称前加入“Lighting”关键字,这样Unity才能识别出这是一个自定义的光照函数。
通过以上设置,角色的材质部分即可变为如下形式(暂定该Shader名为“MyShader2”):
Unity3D教程:3D角色的渲染
其显示效果如下:
Unity3D教程:3D角色的渲染
3、& 边缘光照(Rim Light)和卡通渲染(Toon Shading)
可以通过对上述Shader做以下改进,来达到这种效果:
3.1&&在属性Properties中加入:
&&&1_RimColor (&Rim Color&, Color) = (0.12, 0.31, 0.47, 1.0) 2_RimPower (&Rim Power&, Range(0.5, 8.0)) = 3.0 3_Ramp (&Shading Ramp&, 2D) = &gray& {}
3.2&&在SubShader的变量中也加入相应修改:
&&&01sampler2D _MainTex;02sampler2D _BumpMap;03sampler2D _Ramp;04&05fixed4 _AmbientColor;06fixed4 _SpecularColor;07half _Glossiness;08&09fixed4 _RimColor;10half _RimPower;11&12struct Input {13float2 uv_MainTex;14float2 uv_BumpMap;15half3 viewDir; 16};
3.3&&修改surf函数,进行如下修改:
&&&1void surf (Input IN, inout SurfaceOutput o) {2fixed4 c = tex2D (_MainTex, IN.uv_MainTex);3o.Albedo = c.rgb;4o.Alpha = c.a;5o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));6fixed rim = 1.0 - saturate (dot (normalize(IN.viewDir), o.Normal));7o.Emission = (_RimColor.rgb * pow (rim, _RimPower));8}
这里主要是用来计算边缘光照的,首先通过视线与法线的夹角来找到模型的边缘,然后再根据距离的远近来控制发射光的强度。
3.4&&将“#pragma surface surf CustomBlinnPhong”改成“#pragma surfacesurf CustomBlinnPhong exclude_path:prepass”,同时在LightingCustomBlinnPhong函数来修改漫反射光的计算,来达到卡通渲染的效果。
&&&1fixed NdotL = saturate(dot (s.Normal, lightDir)); 2fixed diff = NdotL * 0.5 + 0.5;3fixed3 ramp = tex2D (_Ramp, float2(diff, diff)).rgb;4fixed diffuse = s.Albedo * LightColor0.rgb * ramp;
通过以上设置,角色的材质部分即可变为如下形式(暂定该Shader名为“MyShader3”):
Unity3D教程:3D角色的渲染
其显示效果如下:
Unity3D教程:3D角色的渲染
可以看出边缘光照的效果,同时还可以看出明显的明暗变化的卡通渲染效果。
三、&&&&&&&小结
综上所述,本文已经给出了人物的几种基本渲染方法及其Shader实现,在这里我并没有去分析每种渲染效果的原理,而仅是从实际出发,直接给出对应的简单实现方法。如果想要对光照模型进行深入理解,可以Google搜索其原理进行了解。最后,给出各种渲染方法的对比图,显示如下:
Unity3D教程:3D角色的渲染
本系列文章由&Unity公司开发支持工程师Amazonzx&编写,。
【上一篇】
【下一篇】
您可能还会对这些文章感兴趣!扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
_____________________________________________________________________________________________________________
问答求助版块规则:
  1、问题尽量描述清楚
& && &2、代码要放在代码块里
& && &3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
& && &5、问题得到解决,请选择最佳答案。
& && &6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 745|回复: 3
unity5.3 版本 地板砖实时反射
shader 如何制作
3180/300排名<font color="#FF昨日变化45主题帖子积分
偶尔光临, 积分 180, 距离下一级还需 120 积分
偶尔光临, 积分 180, 距离下一级还需 120 积分
在线时间97 小时
求 .3 版本 地板砖实时反射&&shader 如何制作 或有写好可以用的!
每日推荐:
9排名<font color="#FF昨日变化2主题帖子积分
蛮牛币16161
在线时间715 小时
材质球默认的standard shader就有个smoothness属性,调成1,就跟镜子一样,闪亮亮的
每日推荐:
9排名<font color="#FF昨日变化1主题帖子积分
蛮牛币12396
在线时间2468 小时
每日推荐:
4397/500排名<font color="#FF昨日变化40主题帖子积分
四处流浪, 积分 397, 距离下一级还需 103 积分
四处流浪, 积分 397, 距离下一级还需 103 积分
在线时间117 小时
请问楼主解决了吗
每日推荐:
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号
经过游戏蛮牛认证的蛮牛小翻译
连续签到30天
七夕浪漫情人
2015年蛮牛社区浪漫七夕 最美情话活动获奖者
游戏蛮牛QQ群会员
加入游戏蛮牛官方QQ群
购买游戏蛮牛书籍专业挖坑,业余搬运
视频地址复制
Flash地址复制
Html地址复制
离线看更方便
用或其他应用扫描二维码
/watch?v=fD_ho_ofY6A Unity官方教程,搬运自youtube。本视频一切权益属于原作者:Unity5官方团队
如有有志向于传播Unity教程,愿意挺身而出制作字幕/后期的同学(边学边传)请私信我。[]~( ̄▽ ̄)~*
这个视频很好地介绍了unity5的标准着色器语言,非常适合初学者!
广播电视节目制作经营许可证:(沪)字第1248号
| 网络文化经营许可证:沪网文[6号 | 信息网络传播视听节目许可证:0910417 | 互联网ICP备案:沪ICP备号-3 沪ICP证:沪B2- | 违法不良信息举报邮箱: | 违法不良信息举报电话:转3Unity5 新功能解析--物理渲染与standard shader
物理渲染是UNITY5最大的亮点之一,物理渲染的采用绝对是下一个世代游戏的热点,UNITY5的大范围使用是一个可喜可贺的事情,关于什么是物理渲染,本人曾经写过一篇博客专门讨论,详见。
物理渲染和当今的主流光照计算最大的区别就是,当今的lambert blinn phone基本上是基于模拟的模型,就是尽可能的去模拟我们看上去的物体反射的颜色,甚至可以说是拍脑袋的模型,用于欺骗我们的眼睛,而基于物理的光照计算则是依据了光线传播的物理特性,更加贴近于真是的光照情况,虽然在实现上还是用了一些近似计算。所以物理渲染在表现自然界的物体时尤其的看上去更加真实。
Unity5里面采用了一套全新的shader 叫做 standard shader,这套shader使用的就是基于物理的光照计算,而老的那些shaderUNITY已经不推荐使用,UNITY5认为我们大多数情况都应该使用standard shader。下图左面使用的是物理渲染,右面使用的是blinn phone,都用来表现一个很光滑的金属,没上贴图,可以明显的感觉到左侧的真实的多,这就是UNITY5给我们在图形质量上带来的提升。
我们来分析一下Standard Shader的各种参数的意义
Albedo: 这就是物体表面的基本颜色,在物理模型中相当于物体表面某处各子表面的散射颜色。
Metallic : 这相当于物理模型中的F(0),即物体表面和视线一致的面的对光线反射的能量,通常金属物体通常超过50%,大部分在90%,而非金属集中在20%以下,自然界中的物质很少有在20%-40%之间的(除非一些人造物体),正因为如此这个属性被形象的称谓metallic(金属感)
Smoonthness:这相当于物理模型中与实现一致的面占所有微面的比例,比例越大,物体越光滑,反之越毛糙,一定要区分这个和mettalic(metallic在描述对反射能量的强弱,smmothness描述表面的光滑程度),当然大所属情况下金属的smoothness都很高。
normal map:法线贴图
height map: 视差贴图,用于在法线贴图的基础上表现高低信息(法线只能表现光照强弱,而视察贴图可以增加物理上的位置的前后)
Occlution:遮挡占据贴图,用于模拟GI,物体在默写凹槽处由于受到光线的减少而显得暗,也就是自遮挡。
Emission:自发光,不过UNITY5的自发光可以在全局光照中当光源使用,非常好
secondary maps:第二道贴图
Detail Mask:对第二道贴图的mask
除了standard shader之外,unity5还提供了一个Standard (Specular setup),主要区别在于,这个shader提供了一个和albedo不同的specular的颜色,也就是漫反射和高光反射的颜色分开,而对于前者albedo控制了漫反射和高光反射,并且认为更多的光是被高光反射了,UNITY文档说对于大多数效果这两种途径基本都可以表现,而选取那种取决于你的习惯...

我要回帖

更多关于 实时阴影shader unity 的文章

 

随机推荐