笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

最近在利用Shader实现眼镜的反射,透明以及高光,法线等效果,Unity虽然为我们提供了很多的Shader,但是在实际项目开发中,大部分不能直接使用,因为项目的需求要求实现的渲染效果时比较细致的,我们项目目前实现的眼镜渲染比较贴近于真实的眼镜,这就要求我们要明白其实现原理,然后将其调试出来,我们的眼镜分为三部分:镜框,镜面,眼鼻三部分。

每一部分都单独对其进行渲染处理,当然如果你讲它们合并在一起也是可以的,镜框的实现需要我们使用法线和原图两张材质就实现了高光,法线效果,非常炫,实现效果如下所示:

接下来实现镜面效果,在这里使用了Cubemap和Diffuse模拟真实环境中的镜面反射效果,实现如下所示:

最后一个是镜鼻的实现,它的实现比较简单只是用了透明处理,实现的效果如下所示:

而且实现了透明遮挡处理,以上就是关于眼镜的实现效果,下面把眼镜镜面的渲染代码给读者展示如下:

Shader "Custom/Glass_Mirror" {Properties {_cubemap ("cubemap", Cube) = "_Skybox" {}_cubemap_slider ("cubemap_slider", Range(0, 1)) = 1_color ("color", Color) = (0.5,0.5,0.5,1)_texture_diffuse ("texture_diffuse", 2D) = "white" {}_alpha_slider ("_alpha_slider", Range(0, 1)) = 1}SubShader {Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}Blend SrcAlpha OneMinusSrcAlpha Pass {
//            Name "FORWARD"
//           Tags {
//                "LightMode"="ForwardBase"
//            }CGPROGRAM#pragma vertex vert#pragma fragment frag#define UNITY_PASS_FORWARDBASE#include "UnityCG.cginc"#include "AutoLight.cginc"#include "UnityPBSLighting.cginc"#include "UnityStandardBRDF.cginc"#pragma multi_compile_fwdbase_fullshadows//#pragma multi_compile_fog//#pragma exclude_renderers gles3 metal d3d11_9x xbox360 xboxone ps3 ps4 psp2 #pragma target 3.0// uniform float4 _LightColor0;uniform samplerCUBE _cubemap;uniform float _cubemap_slider;uniform float4 _color;uniform sampler2D _texture_diffuse; uniform float4 _texture_diffuse_ST;uniform float _alpha_slider;struct VertexInput {float4 vertex : POSITION;float3 normal : NORMAL;float2 texcoord0 : TEXCOORD0;};struct VertexOutput {float4 pos : SV_POSITION;float2 uv0 : TEXCOORD0;float4 posWorld : TEXCOORD1;float3 normalDir : TEXCOORD2;LIGHTING_COORDS(3,4)UNITY_FOG_COORDS(5)};VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;o.uv0 = v.texcoord0;o.normalDir = UnityObjectToWorldNormal(v.normal);o.posWorld = mul(unity_ObjectToWorld, v.vertex);float3 lightColor = _LightColor0.rgb;o.pos = mul(UNITY_MATRIX_MVP, v.vertex );UNITY_TRANSFER_FOG(o,o.pos);TRANSFER_VERTEX_TO_FRAGMENT(o)return o;}float4 frag(VertexOutput i) : COLOR {i.normalDir = normalize(i.normalDir);float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);float3 normalDirection = i.normalDir;float3 viewReflectDirection = reflect( -viewDirection, normalDirection );float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);float3 lightColor = _LightColor0.rgb;float3 halfDirection = normalize(viewDirection+lightDirection);
// Lighting:float attenuation = LIGHT_ATTENUATION(i);float3 attenColor = attenuation * _LightColor0.rgb;float Pi = 3.141592654;float InvPi = 0.31830988618;/
/ Gloss:float gloss = 0.8;float specPow = exp2( gloss * 10.0+1.0);/// GI Data:UnityLight light;#ifdef LIGHTMAP_OFFlight.color = lightColor;light.dir = lightDirection;light.ndotl = LambertTerm (normalDirection, light.dir);#elselight.color = half3(0.f, 0.f, 0.f);light.ndotl = 0.0f;light.dir = half3(0.f, 0.f, 0.f);#endifUnityGIInput d;d.light = light;d.worldPos = i.posWorld.xyz;d.worldViewDir = viewDirection;d.atten = attenuation;d.boxMax[0] = unity_SpecCube0_BoxMax;d.boxMin[0] = unity_SpecCube0_BoxMin;d.probePosition[0] = unity_SpecCube0_ProbePosition;d.probeHDR[0] = unity_SpecCube0_HDR;d.boxMax[1] = unity_SpecCube1_BoxMax;d.boxMin[1] = unity_SpecCube1_BoxMin;d.probePosition[1] = unity_SpecCube1_ProbePosition;d.probeHDR[1] = unity_SpecCube1_HDR;Unity_GlossyEnvironmentData ugls_en_data;ugls_en_data.roughness = 1.0 - gloss;ugls_en_data.reflUVW = viewReflectDirection;UnityGI gi = UnityGlobalIllumination(d, 1, normalDirection, ugls_en_data );lightDirection = gi.light.dir;lightColor = gi.light.color;
// Specular:float NdotL = max(0, dot( normalDirection, lightDirection ));float LdotH = max(0.0,dot(lightDirection, halfDirection));float3 specularColor = 0.0;float specularMonochrome;float node_5610 = 0.2;float3 diffuseColor = float3(node_5610,node_5610,node_5610); // Need this for specular when using metallicdiffuseColor = DiffuseAndSpecularFromMetallic( diffuseColor, specularColor, specularColor, specularMonochrome );specularMonochrome = 1.0-specularMonochrome;float NdotV = max(0.0,dot( normalDirection, viewDirection ));float NdotH = max(0.0,dot( normalDirection, halfDirection ));float VdotH = max(0.0,dot( viewDirection, halfDirection ));float visTerm = SmithJointGGXVisibilityTerm( NdotL, NdotV, 1.0-gloss );float normTerm = max(0.0, GGXTerm(NdotH, 1.0-gloss));float specularPBL = (NdotL*visTerm*normTerm) * (UNITY_PI / 4);if (IsGammaSpace())specularPBL = sqrt(max(1e-4h, specularPBL));specularPBL = max(0, specularPBL * NdotL);float3 directSpecular = (floor(attenuation) * _LightColor0.rgb)*specularPBL*FresnelTerm(specularColor, LdotH);half grazingTerm = saturate( gloss + specularMonochrome );float3 indirectSpecular = (gi.indirect.specular);indirectSpecular *= FresnelLerp (specularColor, grazingTerm, NdotV);float3 specular = (directSpecular + indirectSpecular);/// Diffuse://float NdotL = max(0.0,dot( normalDirection, lightDirection ));float3 directDiffuse = max( 0.0, NdotL) * attenColor;float3 indirectDiffuse = float3(0,0,0);indirectDiffuse *= UNITY_LIGHTMODEL_AMBIENT.rgb; // Ambient Lightfloat3 node_307 = (texCUBE(_cubemap,viewReflectDirection).rgb*_cubemap_slider);//indirectDiffuse += float3(node_307,node_307,node_307); // Diffuse Ambient LightindirectDiffuse += node_307;float4 _texture_diffuse_var = tex2D(_texture_diffuse,i.uv0);diffuseColor = (_texture_diffuse_var.rgb);float3 diffuse = (directDiffuse + indirectDiffuse) * diffuseColor;//float3 diffuse = node_307 + diffuseColor;
/// Final Color:float3 finalColor = diffuse + specular;//float3 finalColor = diffuseColor;fixed4 finalRGBA = fixed4(finalColor,_alpha_slider);UNITY_APPLY_FOG(i.fogCoord, finalRGBA);return finalRGBA;}ENDCG}}FallBack "Diffuse"
}

其实就是利用了反射,法线,透明这些基本的技术综合在一起实现了镜面的Shader处理。。。。

Unity3D眼镜Shader技术实现相关推荐

  1. unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  2. HTML5中的CSS Shader技术

    Adobe在Photoshop和Flashplayer等产品中运用了2D Shader技术来丰富它们的滤镜和动画,现在Adobe也将这种技术运用到了CSS中并将CSS Shaders 提案提交给了W3 ...

  3. Unity3D之Shader自定义编辑器功能拓展

    一.前言 最近在开发一个关卡类的游戏,在导入一些3D物体的时候,发现很多时候同一个3D物体需要渲染的方式不一样,比如这颗树要双面渲染(Cull Off),但在很多情况下是可以剔除背面(Cull Bac ...

  4. VS2010中使Unity3d的shader文件关键字高亮

    一.使用NShader 1.下载并安装NShader1.3(使用其他版本有些许不同) http://nshader.codeplex.com/releases/view/89782 2.关闭VS201 ...

  5. 【西川善司的3D图形技术连载】GPU和Shader技术的基础知识(1~8回)

    本连载的主要目的,是介绍最新的PC和GAME所使用的最新3D图形技术的发展趋势. 暂时的方针是,首先是考虑介绍比较新的PC Game和PS3,XBOX360等新时代游戏机的游戏所采用的技术. 那么首先 ...

  6. Unity3d 室内设计Shader效果

    使用Unity3d做了一个室内设计的应用,但是专业人士说效果不行,这个我看了其他人的一些Unity3d室内 设计的应用,效果很赞.发现我这个的效果确实很有差距.在这个场景里面我用了Unity3d自带的 ...

  7. 【西川善司】GPU和Shader技术的基础知识(全8回)

    本文取自西川善司的3D图形技术连载,全99回 本贴为1~8回,争取每1~2天更新一回吧.半年更新完. 也希望大家能支持. 翻译 Trace 校对&注解 千里马肝 http://www.open ...

  8. (可能是)Magic Leap AR眼镜最技术的评测 | 同行相评

    原作:Rokid R Lab  量子位 授权转载 | 公众号 QbitAI 编者按: MagicLeap One,一家争议公司的首款产品,正式发售以来就褒贬不一. 有人说新事物新品类,做到如此程度实属 ...

  9. 五十年前雨果就有了VR眼镜的技术理念

    如果你喜欢科幻的话,那你肯定不会陌生在科幻领域中最有影响力的奖项-雨果奖.这一奖项是用科幻小说之父雨果·根斯巴克来命名的.1926年,雨果还是一本名为Amazing Stories杂志社的编辑,在这本 ...

  10. Unity3D热更新技术点——ToLua(上)

    注: 本文主要介绍tolua的基本原理及其在unity中的使用,希望阅读本文的读者有lua基础,可通过Lua教程 (其中也有IDE的推荐等)或其他途径先进行lua 的学习 热更新 在介绍tolua前, ...

最新文章

  1. typedef interrupt void (*PINT)(void)的分析
  2. 【职场】面试中最难回答频率最高的70个问题
  3. [core]-ARM Core的分类和总结
  4. 送书 | 经典框架Kaldi配套的语音识别实战
  5. javaSE各阶段练习题--流程控制
  6. 关于 SAP 电商云 Spartacus UI SSR 的 state transfer 问题
  7. 连接数_全国建成5G基站超48万个 5G终端连接数已过亿
  8. Java实现图片压缩代码,图片大小转换
  9. Redis 在 MySql 中的优化历程
  10. wx.chooseimage 超过了最大请求长度_一次 HTTP 请求到底经历了什么?
  11. oracle中job的retry次数,Oracle 19c注意事项: DBMS_JOB 行为变化
  12. 经典语录 - 人生十悟
  13. 微信小程序--七彩爱心加载动画
  14. Pytorch 3D卷积
  15. MS COCO数据集输出数据的结果格式(result format)和如何参加比赛(participate)(来自官网)
  16. 计算机组成原理第三次实验(静态随机存储器实验)
  17. vscode 解决 无法打开 chrome
  18. Redis教程之基础-五种数据基本操作
  19. ionic+vue+capacitor系列笔记--02项目中集成Capacitor,添加android,ios平台,真机运行项目
  20. [导入]收录Google公益广告的答案

热门文章

  1. matlab 效度,如何用spss进行效度检验_spss信效度检验_spss问卷信效度检验
  2. 机器周期、指令周期、时钟周期、总线周期
  3. 浏览器如何禁用或启用Cookie
  4. 《工科泛函分析基础》预习笔记 证明:可测集上的连续函数都是可测函数
  5. JS调用google DEMO朗读
  6. 【转】上大数学系博士点
  7. 简单分析Mysql不同方式联表查询的效率问题
  8. 我的毕业旅行--Four night in beijing
  9. excel如何去重统计户数_excel表格单一数据统计-Excel如何去重,然后统计数据?...
  10. Vue 使用Excel表格导入导出