转载请标明出处http://www.cnblogs.com/zblade/

  最近捣鼓了一下金属光泽的shader的实现,在一些高模展示的时候或者模型的金属部分的表现的时候,我们需要给模型添加一些金属光泽,表现出一个模型某些金属装备上有一定的反光。今天我主要写一种基于贴图实现的金属反光的效果。不过我没有添加最终的效果,大家可以自己理解一下做一些贴图实现各自的模型效果。

  Unity5在更新后推出一种基于物理的shader-standard shader,其中给定了一个参数就是metallic 和 smoothness,可以通过添加一个纹理贴图来实现模型的金属表现。大概查看了一下源代码,主要也是对金属光泽纹理贴图的采样,然后分别赋值。主要的操作代码:

half2 MetallicGloss(float2 uv)
{
half2 mg;
#ifdef _METALLICGLOSSMAP
mg = tex2D(_MetallicGlossMap,uv.xy).ra;
#else
mg = half2(_Metallic,_Glossiness);
#endif
return mg }

  分析其实现的原理,其实就是如果有贴图,则采样贴图的r通道和alpha通道,如果没有贴图,则根据参数进行赋值。基于standard提供的思路,我提供了一个类似的实现方式:首先让美术提供一个黑白透的贴图,合并在主纹理贴图中(通过合并,可以减少贴图数量),其中的通道值可以用来作为金属光泽的过滤效果。然后让美术提供一个贴图,可以用来实现金属光泽的光照,常见的为圆形光照,所以这儿我就采用的圆形光照来实现。主要的计算是在顶点shader中计算圆形光照的贴图采样坐标,所以我主要给出计算的关键部分即可:

v2f vert(a2v)
{
v2f o = (v2f);
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = v.texcoord;
//计算球形光源的采样坐标,在观察空间中
half3 viewNormal = mul((float3x3)UNITY_MATRIX_MV,v.normal);
half4 viewPos = mul(UNITY_MATRIX_MV,v.vertex);
half3 projPos = normalize(viewPos.xyz/viewPos.w);
half3 reflectVar = reflect(projPos,viewNormal);
half m = 2.0 * sqrt(reflectVar.x * reflectVar.x + reflectVar.y*reflectVar.y + (reflectVar.x+)*(reflectVar.z + ));
o.sphereUV = fixed2(reflectVar.x/m + 0.5, reflectVar.y/m + 0.5);
} fixed4 frag(v2f i):SV_Target
{
//基本计算
...
half4 mainVar = tex2D(_MainTex,i.uv);
//用主贴图的alpha通道来做金属光泽的处理
half3 specular = tex2D(_SphereTex,i.sphereUV).rgb * mainVar.a *_SpecPower;
//
half3 diffuse = mainVar.rgb * _LightColor.rgb * _MainColor.rgb * max(,dot(v.normal,lightDir)) ;
fixed4 color;
color.rgb = diffuse + specular;
color.a = ;
return color;
}

本文实现的基本思路就是用一个基本的圆形贴图作为金属光泽的光照,其具体的调节做在住贴图的alpha通道中采样,所以关键计算是球形的采样坐标和通道的计算过滤。大家可以测试一下表现效果,基本的金属光泽就是这样,大家有什么反馈可以给我留言,共同讨论成长~

带金属光泽的模型shader的实现的更多相关文章

  1. 4. 纯 CSS 创作一个金属光泽 3D 按钮特效

    原文地址:https://segmentfault.com/a/1190000014599280 HTML代码: <div class="box">BUTTON< ...

  2. thinkphp3.2.3 无法调用带下划线的模型

    thinkphp 3.2.3 如果表名中带有下划线,在分割的时候命名模型类,首字母大写,例如:order_customer_bom 为表名 .模型名为OrderCustomerBomModel 引用的 ...

  3. 如何用纯 CSS 创作一个金属光泽 3D 按钮特效

    效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/full/MGeRRO 可交互视频教程 此 ...

  4. 前端每日实战:4# 视频演示如何用纯 CSS 创作一个金属光泽 3D 按钮特效

    效果预览 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/full/MGeRRO 可交互视频教程 此视频是可以 ...

  5. 硬货 | 手把手带你构建视频分类模型(附Python演练))

    译者 | VK 来源 | Analytics Vidhya 概述 了解如何使用计算机视觉和深度学习技术处理视频数据 我们将在Python中构建自己的视频分类模型 这是一个非常实用的视频分类教程,所以准 ...

  6. 机器学习——打开集成方法的大门,手把手带你实现AdaBoost模型

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第25篇文章,我们一起来聊聊AdaBoost. 我们目前为止已经学过了好几个模型,光决策树的生成算法就有三种.但是我们每 ...

  7. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色

    一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...

  8. 从3dMax导出供threeJS使用的带动作模型与加载

    评论区发现的建议,最近没空测试,先贴这 还有好多人说找不到插件的 https://pan.baidu.com/s/1Q5g0... 密码:b43e . 应该是他们现在只是维护blender,只有这个的 ...

  9. [Unity] Shader(着色器)输入输出和语义

    在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Prope ...

随机推荐

  1. 使用FileReader实现前端图片预览

    在FileReader出现之前,前端的图片预览是这样实现的:把本地图片上传到服务器,服务器把图片地址返回,并把它替换到图片元素的src属性. 这种方法的缺点是:必须要先把图片上传到服务器.那么问题来了 ...

  2. Disruptor深入解读

    将系统性能优化到极致,永远是程序爱好者所努力的一个方向.在java并发领域,也有很多的实践与创新,小到乐观锁.CAS,大到netty线程模型.纤程Quasar.kilim等.Disruptor是一个轻 ...

  3. webservice_模拟报文测试

    一.WebService测试小工具STORM  二.利用MyEclipse的WebService视图调用webservice Ø   除了客户端生成代码编写程序调用之外.还可以用MyEclipse提供 ...

  4. 关于post与get请求参数存在特殊字符问题

    遇到项目中存在文本编辑框输入特殊字符 比如:# ? & 空格 , 导致后台接受不到参数问题,对可能存在特殊字符的参数进行encodeURIComponent; C#后台接受参数不需要解码 也可 ...

  5. Android 仿映客直播间给主播发送礼物(实现连击效果)

    效果图 类库的介绍 org.dync.giftlibrary.widget GiftAnimationUtil.java 动画类GiftControl.java 给外部调用的类(核心)GiftFram ...

  6. Android基础工具函数代码集

    整理在学习研究Android开发,编写了一些基本用到的工具集,现在整理分享(后续会持续更新,有问题还请指出). 1.HttpClient工具,使用Apache的HttpClient类实现get和pos ...

  7. 自定义仿 QQ 健康计步器进度条

    自定义仿 QQ 健康计步器进度条 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 闲着没事,趁上班时间偷偷撸了 ...

  8. BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)

    如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...

  9. 在SQL Server里如何处理死锁

    在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...

  10. 谈谈事件对象-event

    JavaScript 中的事件对象(event) 当我们每次触发一种事件(如点击事件),我们会在回调函数中传入事件对象event.今天就来来谈谈. 1.当我们想判断当前事件是我们想要的事件类型时,可以 ...