转载请标明出处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. HDU5726(RMQ&&二分)

    GCD Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status D ...

  2. OpenCV 3.2正式发布啦

    2016年12月23号OpenCV社区宣布了OpenCV3.2版本正式发布,这个是在OpenCV3.1版本发布一年以后再次升级.在3.2版本中有总数超过数千个的改进与修正,是OpenCV3.x系列中最 ...

  3. win10环境下python3.5安装步骤

    点我去Python官网下载 往下翻几页就能看到各种版本的Python,当前最新的是Python3.6,也没多大区别,我选择的是3.5.2 64位的,点击download 根据自己的电脑配置,我选择的是 ...

  4. ABP入门系列(10)——扩展AbpSession

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 一.AbpSession是Session吗? 1.首先来看看它们分别对应的类型是什么? 查看源码发 ...

  5. css浮动(float,clear)

    1. 以div元素布局为例,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流,是指标准流中的div. 无论多么复杂的布局,其基本出发点均是:“如何在一行显示多个div元素”,显然标准 ...

  6. 微信jsSDK公众号开发时网页提示 invalid signature错误的解决方法

    微信公众号开发jsSDK,链接地址不能加?参数,可以通过#传递参数. 不然.页面wx.ready()时就会报错,用 wx.error(function (res) { alert("接口验证 ...

  7. Vue.js 系列教程 3:Vue-cli,生命周期钩子

    原文:intro-to-vue-3-vue-cli-lifecycle-hooks 译者:nzbin 这是 JavaScript 框架 Vue.js 五篇教程的第三部分.在这一部分,我们将学习 Vue ...

  8. iOS Paros 连接在同一WIFI下的网络抓包

    图文详解: 说说网络抓包,几天前的事了,想抓个包看看 某爱网(全名自己脑补)的数据,就上网找了一下抓包,以前经常抓接口,时间长了忘了.那时候也不是用苹果手机抓取的,前几天试着抓了一下,今天不适合敲代码 ...

  9. Java设计和实现方法

    方法签名 方法名是驼峰命名 方法名最好能说明该方法主要做什么 方法参数的名字最好能说明该参数的意义 方法参数个数最好低于6个 例如: public void setTitleVisible(int l ...

  10. getchar()不停止原因

    应该是你的输入流中还有残留的字符,getchar()()会接受那个字符.你可以在调用getchar()()之前用fflush(stdin)刷新一下输入缓冲区. 上面一段里面,应该有读入语句吧,没读干净 ...