Phong 光照模型(镜面反射)
Phong 光照模型
镜面反射(高光),是光线经过物体表面,反射到视野中,当反射光线与人的眼睛看得方向平行时,强度最大,高光效果最明显,夹角为90度时,强度最小。
specular = I*R*V;
specular:反射光经过物体表面反射后进入人眼的光强;
I:反射光的光强,Phong依然是理想模型,所以不考虑光的衰减,即反射光的光强和入射光的光强相等;
R:反射光线的方向;
V:视线的方向;
Shader程序
- /*******************************************
- Phong 光照模型
- 1. 理想的镜面反射;
- *******************************************/
- Shader "JQM/Specular"
- {
- Properties
- {
- _Color("Color", color) = (1.0,1.0,1.0,1.0)
- _SpecColor("Specular Color", color) = (1.0,1.0,1.0,1.0)
- _Shininess("Shininess",float) =
- }
- SubShader{
- Pass{
- Tags { "LightMode" = "ForwardBase"}
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- //使用自定义变量
- uniform float4 _Color;
- uniform float4 _SpecColor;
- uniform float _Shininess;
- //使用Unity定义的变量
- uniform float4 _LightColor0;
- struct vertexInput{
- float4 vertex:POSITION;
- float3 normal:NORMAL;
- };
- struct vertexOutput{
- float4 pos:SV_POSITION;
- float4 posWorld:TEXCOORD0;
- float3 normalDir:TEXCOORD1;
- };
- //顶点程序
- vertexOutput vert(vertexInput v)
- {
- vertexOutput o;
- o.posWorld = mul(_Object2World, v.vertex);
- o.normalDir = normalize( mul(float4(v.normal,0.0),_World2Object).xyz);//将模型空间的法线转到世界空间
- o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
- return o;
- }
- //片段程序
- float4 frag(vertexOutput i):COLOR
- {
- float3 normalDirection = i.normalDir;
- float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz- i.posWorld.xyz);//视线方向
- float3 lightDirection;
- float atten = 1.0;
- lightDirection = normalize(_WorldSpaceLightPos0.xyz);//光线方向
- float3 diffuseReflection = atten * _LightColor0.xyz * max(0.0, dot(normalDirection,lightDirection));//计算兰伯特漫反射
- float3 specularReflection = atten * _LightColor0.xyz * _SpecColor.rgb*max(0.0, dot(normalDirection,lightDirection))*pow(max(,dot(reflect(-lightDirection,normalDirection),viewDirection)),_Shininess);//计算高光
- float3 lightFinal = diffuseReflection +specularReflection+ UNITY_LIGHTMODEL_AMBIENT.xyz;
- return float4(lightFinal*_Color.rgb,1.0);
- }
- ENDCG
- }
- }
- }
Blinn-phong 高光
这个方式的高光是一种数学模型的优化,它将计算反射向量的过程替换为计算视线和光线的半角向量,提高了运算速度,它的效果比较平滑,运算速度快。
Phong 光照模型(镜面反射)的更多相关文章
- 一步一步学RenderMonkey(3)——改良Phong光照模型 【转】
转载请注明出处: http://blog.csdn.net/tianhai110 改良后的Phong光照模型: 上一节实现的phong镜面光照模型,如果固定光源,移动视点(及matView 关联为ma ...
- Phong光照模型的Shader实现
计算反射向量 Phong用到的是反射向量,计算反射向量的公式是 R = 2*N(dot(N, L)) - L 这个公式是根据向量的投影公式以及平行四边形法则推导出来的 详细步骤请看这篇文章,讲的非常好 ...
- Phong和Blinn-Phong光照模型
Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.Phong模型 Phone模型计算中的一个关键步骤就是反射向量R的计算: 上图中的位于表面“下面”的向 ...
- 【转】Phong和Blinn-Phong光照模型
来自:http://www.cnblogs.com/bluebean/p/5299358.html Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.P ...
- [CG编程] 基本光照模型的实现与拓展以及常见光照模型解析
0.前言 这篇文章写于去年的暑假.大二的假期时间多,小组便开发一个手机游戏的项目,开发过程中忙里偷闲地了解了Unity的shader编写,而CG又与shaderLab相似,所以又阅读了<CG教程 ...
- Phong光照以及其他
在说光照之前,有必要先弄清法线的变换,假设Mworld 将物体的定点一一变换到世界空间,如果我们对法线实施同样的变化,,以为能将法线变换到世界空间,但世界上变换之后的法线不再与表面垂直,就像下 ...
- Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里
[旧博客转移 - 2016年4月4日 13:13 ] 油腻的师姐: 以前玩过一款很火热的端游<剑灵>,剑灵刚出来的时候,某网页游戏广告视频中有句台词:"我不断的在寻找,有你的世界 ...
- 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现
[Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...
- (转)光照模型及cg实现
经典光照模型(illumination model) 物体表面光照颜色由入射光.物体材质,以及材质和光的交互规律共同决定. 由于环境光给予物体各个点的光照强度相同,且没有方向之分,所以在只有环境光的情 ...
随机推荐
- 51nod 1024 矩阵中不重复的元素
1024 矩阵中不重复的元素 题目来源: Project Euler 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一个m*n的矩阵. 该矩阵的 ...
- MyEclipse配置Tomcat
1.在Window->Perferences->MyEclipse->Servers->Tomcat->Tomcat 7.x中启用Tomcat并配置Tomcat路径和JD ...
- 转】RDD与DataFrame的转换
原博文出自于: http://www.cnblogs.com/namhwik/p/5967910.html RDD与DataFrame转换1. 通过反射的方式来推断RDD元素中的元数据.因为RDD本身 ...
- Android开发学习——ButterKnife使用
为了码代码的效率,我们有了ButterKnife;其基本使用如下步骤: 1.在Android Studio的Setting中,下载plugin 2.在整个Project的build.gradle中添加 ...
- AJPFX:关于面向对象及java的一些机制的思考
1.变量的作用域和生命周期什么关系? 2.java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量吗?比如高级别的应用里是不是有例外呢? 3.java源文件中代码的组织方式一 ...
- IIS 安装了.net framework 4.0/4.5 却找不到相应应用程序池
通常情况下是因为没注册造成的,有些安装包会自己帮你注册上有些不会,感觉略坑. 注册方法:在计算机中点击 开始菜单–>运行 拷贝以下内容运行一下即可. C:\WINDOWS\Microsoft.N ...
- java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to
在做android解析服务器传来的json时遇到的错误. 服务器传来的数据格式 [{"," id":"7ef6815938394fce88a5873312b66 ...
- Fragment懒加载预加载
1. 预加载viewpager.setOffscreenPageLimit(2);,默认是预加载1,可以结合懒加载使用. 如果希望进入viewpager,Fragment只加载一次,再次滑动不需加载( ...
- Jenkins .NET项目持续集成配置
基本步骤 1. 安装并配置MSBUILD 在系统管理->插件管理->添加MSBuild插件 在系统管理->系统设置->找到MSBuild配置部分,配置不同的MSbuild版本 ...
- vue2.0 静态prop和动态prop
动态prop: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...