Unity3D shaderLab 使用BlinnPhong高光类型

上一篇我们实现了自定义高光类型,这一篇,我们说Blinn高光,它是另一种计算和估算高光更高效的方式,它是通过视线防线和光线方向,所形成的半角向量来完成。

这种方式比我们自己形成反射向量来进行计算更加高效。在UnityCG.cginc文件中内置的BlinnPhong光照模型就是半角矢量完成的。

首先还是创建一个shader,一个材质球,双击shader,打开编辑器。

1:Properties

Properties {

_MainTex ("Base (RGB)", 2D) = "white" {}

_MainTint("Diffuse Tint",Color)=(,,,)

_SpecularColor("Specular Color",Color)=(,,,)

_SpecularPower("Specular Power",Range(0.1,))=

}

2:SubShader申明变量

CGPROGRAM

#pragma surface surf MyBlinnPhong

sampler2D _MainTex;

float4 _SpecularColor;

float4 _MainTint;

float _SpecularPower;

3:LightingMyBlinnPhong光照模型实现

inline fixed4 LightingMyBlinnPhong(SurfaceOutput s,fixed3 lightDir,half3 viewDir, fixed atten){

float3 halfVector = normalize(lightDir+viewDir);

float diff = max(,dot(s.Normal, lightDir));

float nh = max(,dot(s.Normal, halfVector));

float spec = pow(nh,_SpecularPower)*_SpecularColor;

float4 c;

c.rgb = (s.Albedo*_LightColor0.rgb*diff)+(_LightColor0.rgb*_SpecularColor.rgb*spec)*(atten*);

c.a = s.Alpha;

return c;

}

4:surf函数

half4 c = tex2D (_MainTex, IN.uv_MainTex)*_MainTint;

最终效果如下:

最左侧是BlinnPhong,最右侧是自定义Phong,中间的是最基础的高光效果。

BlinnPhong高光模型和phong高光模型效果几乎一致,除了前者使用更少的代码更高效,他们的效果几乎一致。

在上面的 LightingMyBlinnPhong光照模型中,我们为了获得半角向量,视线方向和入射方向叠加,通过normalize获得了半角向量。

我们再简单的对顶点法线和新的半角向量进行点乘运算从而获得我们的高光值,再对它进行 SpecularPower次方求幂后乘以高光颜色值 SpecularColor。

虽然过程简化,但是同样能给我们带来出色的高光效果。

code start--------------------------------------------------------------------------------

Shader "91YGame/BlinnPhong" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainTint("Diffuse Tint",Color)=(,,,)
_SpecularColor("Specular Color",Color)=(,,,)
_SpecularPower("Specular Power",Range(0.1,))=
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
#pragma surface surf MyBlinnPhong sampler2D _MainTex;
float4 _SpecularColor;
float4 _MainTint;
float _SpecularPower; struct Input {
float2 uv_MainTex;
}; inline fixed4 LightingMyBlinnPhong(SurfaceOutput s,fixed3 lightDir,half3 viewDir, fixed atten){
float3 halfVector = normalize(lightDir+viewDir);
float diff = max(,dot(s.Normal, lightDir));
float nh = max(,dot(s.Normal, halfVector));
float spec = pow(nh,_SpecularPower)*_SpecularColor; float4 c;
c.rgb = (s.Albedo*_LightColor0.rgb*diff)+(_LightColor0.rgb*_SpecularColor.rgb*spec)*(atten*);
c.a = s.Alpha;
return c;
} void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex)*_MainTint;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

code end --------------------------------------------------------------------------------

Unity3D ShaderLab 使用BlinnPhong高光类型的更多相关文章

  1. Unity3D ShaderLab 创建自定义高光类型

    Unity3D ShaderLab 创建自定义高光类型 在上一篇,我们认识了Unity基础的高光实现,本次主要是研究如何对Phong高光类型进行顶点操作,以及在表面着色器中使用Input结构体的新参数 ...

  2. Unity3D ShaderLab 基础的高光实现

    Unity3D ShaderLab 基础的高光实现 关于高光: 在一个物体表面的高光属性就是为了描述它是如何表现光泽.这种类型的效果在着色器的世界中通常称为视点相关效果. 之所以这样说,是因为为了实现 ...

  3. Unity3D ShaderLab 各向异性高光

    Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. ...

  4. Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

    Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的 ...

  5. Unity3D ShaderLab 立方体图的菲涅尔反射

    Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情 ...

  6. Unity3D ShaderLab 透明裁剪着色器

    Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪 ...

  7. Unity3D ShaderLab 布料着色器

    Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth ...

  8. Unity3D ShaderLab 漫反射卷积光照模型

    Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ...

  9. Unity3D ShaderLab 模拟纹理运动

    Unity3D ShaderLab 模拟纹理运动 这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果.算是创建纹理动画的基础技术之一. 所以 准备一个新的着色器文 ...

随机推荐

  1. 初始hibernate(一)

    Hibernate(开放源代码的对象关系映射框架) Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的or ...

  2. 分支语句switch case

    Switch case必须与break一起使用 Break 是跳转语句.与switch case连用的时候是跳出最近的{}. static void Main(string[]args ) { //s ...

  3. if条件语句练习题

    习题一: 做一个算缘分的小游戏:输入男方姓名,女方姓名,输出缘分指数,给出建议. static void Main(string[] args) { //做一个算缘分的小游戏: //输入男方姓名,女方 ...

  4. ACTIVITI 源码研究之命令模式执行

    ACTIVITI 是一个优秀开源软件,通过阅读源码,我们不但可以了解工作流引擎执行的原理还可以增加个人的编码功力. ACTIVITI 所有执行过程都是采用命令模式进行执行. 本文主要描述流程引擎数据保 ...

  5. C#入门篇6-6:字符串操作 StringBiulder string char[]之间的转化

    //StringBiulder string char[]之间的转化 public static void Fun3() { StringBuilder sb = new StringBuilder( ...

  6. sharepoint2010无法创建网站集

    出现以上错误,查看IIS中有关Sharepoint的网站中的“身份验证”中ASP.Net模拟是否为禁用,如果为禁用,请启用即可.

  7. Python 2.7教程

    参考:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000

  8. java 面向对象编程--第17章 I/O系统

    1.I/O操作指的是输入和输出流的操作.相对内存而言,当我们从数据源中将数据读取到内存中,就是输入流,也叫读取流.当我们将内存中处理好的数据写入数据源,就是输出流,也叫写入流. 2.流按照内容分类:字 ...

  9. 模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。

    需要用到的lib包 :解析json  gson包,从网络地址解析json数据成String字符串的异步网络解析工具AsyncHttpClient等 下载地址:点击下载 Xlistview 下拉上拉第三 ...

  10. 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。

      package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...