【旧博客转移 - 2016年4月4日 13:13 】

油腻的师姐:

以前玩过一款很火热的端游《剑灵》,剑灵刚出来的时候,某网页游戏广告视频中有句台词:“我不断的在寻找,有你的世界在哪里”,该广告中的人物,音效都模仿了剑灵,而《剑灵》中的人物模型表面看上去油光发亮,所以就被网友改成了:“我不断的洗澡,油腻的师姐在哪里”
像这样(皮肤表面的高光)
 

这样
 

 
还有~ 这样
 
其实这是使用了镜面反射着色,除了剑灵,其他很多高品质的AAA级游戏也都使用了不同的镜面高光,来增强视觉冲击力和超现实感。
 

Phong高光类型

Phong光照模型是图形学中表现很友好的高光类型,是一种非常常见的镜面高光模型,从游戏到电影都有诸多应用
镜面反射跟漫反射的区别就是,漫反射的反射光是很分散的。镜面反射的反射光会集中在一起,
视线离反射光越近,射入我们眼中的光也就越多,反之则看不到反射光
 
 

Phong光照计算公式

Spec = pow( max(0 ,cos<R, V>), gloss)
 
R:反射光向量
V:视线向量
gloss:镜面的光滑程度,gloss越大就表示越光滑
 

Phong光照模型的Shader实现

Shader "lijia/Phong"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Specular("Specular", Range(, )) =
_SpecColor("SpecColor", Color) = (,,,)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 normal : TEXCOORD1;
float3 lightDir : TEXCOORD2;
float4 objPos : TEXCOORD3;
}; sampler2D _MainTex;
float4 _MainTex_ST; float4 _LightColor0; float _Specular;
float4 _SpecColor; v2f vert (appdata_full v)
{
v2f o;
o.objPos = v.vertex;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.normal = v.normal;
o.lightDir = ObjSpaceLightDir(v.vertex);//把光向量从世界空间转成模型空间
return o;
} fixed4 frag (v2f i) : SV_Target
{
float3 L = normalize(i.lightDir);
float3 N = normalize(i.normal);
float3 viewDir = normalize(ObjSpaceViewDir(i.objPos));//计算出视线 float diff = saturate(dot(L, N));
float3 reflection = normalize(2.0 * N * diff - L);//反射向量
float spec = pow(max(, dot(reflection, viewDir)), _Specular);
float3 finalSpec = _SpecColor.rgb * spec;
//漫反射+镜面高光+环境光
float3 finalLight = diff * _LightColor0 + finalSpec + UNITY_LIGHTMODEL_AMBIENT; fixed4 col = tex2D(_MainTex, i.uv);
return col * float4(finalLight, );
}
ENDCG
}
}
}

计算反射向量

Phong用到的是反射向量,计算反射向量的公式是
R = 2*N(dot(N, L)) - L
这个公式是根据向量的投影公式以及平行四边形法则推导出来的
详细步骤请看这篇文章,讲的非常好
 

Blinn-phong光照模型

blinn是一个人的名字,他叫吉姆·布林,图形学界的大牛,他发现了使用半角向量代替反射向量的计算方式

原理是通过视线向量跟光向量的半角向量代替反射向量
halfVector = normalize( L + V );
这样提高了代码的计算效率,在视觉上也更加平滑,因此它成为了很多CG软件中默认的光照模型
Shadre代码跟Phong类似,我就不贴了
 

将Phone光照用到剑灵模型上的效果

右边是Game视图中加了后期效果的

参考资料:

《ShaderLab开发实战详解》

《Unity着色器和屏幕特效开发秘籍》

【浅墨Unity3D Shader编程】之十三 单色透明Shader & 标准镜面高光Shader

Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里的更多相关文章

  1. 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现

    [Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...

  2. 【Unity Shader学习笔记】Unity光照基础-高光反射

    1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: ...

  3. 【Unity Shader】四、高光反射Specular Shader例子

    http://www.cnblogs.com/guxin/p/unity-diffuse-shader-demo.html 在上文中已经学习了漫反射Diffuse Shader和环境光,现在再在此基础 ...

  4. Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

    关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...

  5. Unity Shader 知识点总结(一)

    在学习了一段时间的Unity Shader后,打算写一些知识总结,便于今后的查找.如有错误,希望大家指出更改. 本文参照的unity入门精要一书,做一个知识归纳,如有兴趣可以看看其开源的部分,是一本比 ...

  6. Unity Shader入门教程(二)最基本的Diffuse和Normal样例

    本教程参考了<猫都能学会的Unity3dShaderLab教程.CHM>, 1.请上网搜索并下载此文件. 2.随后再下载里面提到的素材: http://vdisk.weibo.com/s/ ...

  7. 【Unity Shader】(六) ------ 复杂的光照(上)

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题.              [Unity Sha ...

  8. 【转】《Unity Shader入门精要》冯乐乐著 书中彩图

    为方便个人手机学习时候查阅,从网上转来这些彩图. 如属过当行为,联系本人删除. 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_s ...

  9. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

随机推荐

  1. The dplyr package has been updated with new data manipulation commands for filters, joins and set operations.(转)

    dplyr 0.4.0 January 9, 2015 in Uncategorized I’m very pleased to announce that dplyr 0.4.0 is now av ...

  2. iOS安全攻防之代码混淆

    iOS 代码安全之代码混淆实践: 前言: 在8月份的时候写了个关于 class-dump 反编译的文章(使用 Class-dump 反编译),利用 class-dump 工具可以反编译出工程的头文件, ...

  3. web socket教程

    web socket是一种网络通信协议,很多网页应用中都会使用到它,比如聊天室,选票等等. 一.为什么需要WebSocket? HTTP是无连接(无连接的含义是限制每次连接只处理一个请求.服务器处理完 ...

  4. js实现选项卡切换的效果

    效果图: css 代码: <style type="text/css"> *{margin: 0;padding: 0;list-style: none;} .demo ...

  5. poj3417

    poj3417 题意 给出一颗 n 个节点, n - 1 条边的树,再加上 m 条新边,允许删掉树边和新边各一条,问能使树分为两部分的方案数. 分析 在树的基础上加上不重复的新边一定会构成环,那么考虑 ...

  6. uibutton颜色设置

     UIColor *color = [UIColor colorWithRed:100 / 255.0 green:20 / 255.0 blue:50 / 255.0 alpha:1.0]; 

  7. c++ thread

    Either pthread_join(3) or pthread_detach() should be called for each thread,that an application crea ...

  8. 深入分析Java的String类的方法与特点

    字符串是任何编程语言都必须支持的变量类型,有些编程语言是直接提供了原生的变量类型,有些编程语言则使用语法特性以 SDK 的形式提供支持.在Java编程平台中,对字符串的支持使用了后者的形式,就是通过在 ...

  9. Docker 网络命令

    docker network create docker network connect docker network ls docker network rm docker network disc ...

  10. Mac系统占用空间大、空间不够、查看系统文件大小分布

    最近电脑老提示空间不够,甚是心烦,决定研究下,为啥空间这么快就花完了. 如图,256的空间,就剩下几个G了,其中最大头的系统占用:160G,占比60%多,我勒个擦... 正常情况下:我们可以点击管理, ...