Light Mode

根据现有参数(lightVec, eyeVec, normal…)计算最终颜色的算法

Blinn Phong

前面所学的Ambient+Diffuse+Specular

Phong

区别在于高光计算

高光:镜面反射。但大部分材质只能反射最亮的部分,反射带有模糊
所以真实的模拟高光:需要reflection map,做一些处理去掉过于暗的部分,然后像全局光照中的Cube Map 那样贴到物体上

所以在Phong中使用更真实的方法计算高光

①计算光向量和眼睛向量夹角中线和法线的夹角

float R=-reflect(L,N); //计算出射光线
float RdotV=saturate(dot(R,V));//计算出射光线和眼睛向量的夹角
float SpecPower=pow(RdotV,gloss);

②计算光泽范围

float SpecPower=pow(RdotV,gloss);

③Specular=SpecPowerSpecularColorSpecularTexture;

Blinn更适合计算金属材质
Phong更适合塑料材质

Cook/Torrence

最初用于模拟金属
光滑的物体,微观下也是不平的。所以镜面反射式存在损失的
N:法线
L:光向量
V:眼睛向量
H:眼睛和光线夹角中线

float CookTorrance(float NdotL, float NdotV, float NdotH,float VdotH, float Roughness1, float Roughness2)
{ Roughness*=3.0f;//Compute geometric termfloat G1 =(2.0f*NdotH*NdotV)/VdotH;float G2 =(2.0f*NdotH*NdotL)/VdotH;float G=min(1.0f,max(0.0f,min(G1,G2)));//选择G1和G2中最小的那个但要在[0.0f,1.0f]的范围内//Compute fresnel term 光在模型边缘的作用float F=Roughness2+(1.0f-Roughness2)*pow(1.0f-NdotV,5.0f);//Compute the roughness term 计算表面的粗糙度float R_2=Roughness1*Roughness1;float NdotH_2= NdotH* NdotH;float A=1.0f/(4.0f*R_2*NdotH_2*NdotH_2);float B=exp(-(1.0f-NdotH_2)/(R_2*NdotH_2));float R=A*B;return ((G*F*R)/(NdotH*NdotV));}float4 pixel(vertex2pixel In, unifrom float4 lightColor)
{Ambient=AmbientColor*ColorTexture;Specular=CookTorrance(......)*SpecularColor*SpecularTexture;float4 final_light=lightColor*diffuselight*((ColorTexture*DiffuseColor)+Specular)+Ambient;
}

Roughness即可使用变量输入:整个物体的粗糙度一样
也可使用贴图输入:Roughness1,Roughness2存在R和G通道
可以精细控制同一物体不同地方的粗糙度

Oren Nayar

模拟漫反射
一般的漫反射:用法线和光向量的夹角来表示,这种情况漫反射模拟的表面比较光滑
实际上:许多材质非常粗糙

HLSL 学习笔记7 Light Mode相关推荐

  1. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效. ...

  2. HLSL学习笔记(一):基础

    前言 五一在家无事,于是学习了一下HLSL,基于XAN4.0的.学习完了也就总结一下,纯粹是新手学习的经验之谈,纰漏之处还望见谅,不喜勿喷. HLSL是一种使用GPU渲染出图像的技术,不仅可以改变最终 ...

  3. HLSL 学习笔记5 光照2

    Light Attenuation 光源离物体越远,光所照到的部分越少 (适用于点光源,方向光不衰减,聚光灯的衰减不一样) float d=length(In.light.xyz); //以线性衰减 ...

  4. HLSL 学习笔记1 vertex shader, pixel shader

    VERTEX SHADER 模板 //v2f 是输出结构,在前面定义了 v2f v(a2v In, uniform float4 lightPosition)//uniform 说明该数据来自shad ...

  5. HLSL 学习笔记9 Reflection Mapping

    镜面反射 光线追踪:物体每个像素发出光线,与物体交互,然后返回颜色-代价太高 reflection mapping:模拟反射的简易方法 ①制作一个Cube Map ②定义CubeMap和其采样器 te ...

  6. HLSL 学习笔记4 光照1

    由三部分组成 1 ambient 环境光 :没有固定来源,来自周围 2 diffuse 漫反射 :来自光源,但反射向各个方向:需要计算光线和物体表面法线的夹角: !!!:计算向量时确保坐标是在同一空间 ...

  7. HLSL 学习笔记3 法线映射

    法线贴图 法线用x,y,z三个向量来表示,在三维空间中的方向 法线贴图的rgb通道分别储存法线在xyz三个方向上的分量 r:[0,255]代表 与x轴成[-90,90]度角 g: y轴 b:z轴 法线 ...

  8. unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)

    Unity3D学习笔记(四)天空.光晕和迷雾 六年前第一次接触<魔兽世界>的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的地方,深深印在我的脑海里.当时在艾泽拉斯大陆还不能使用飞行坐骑,试 ...

  9. Unity学习笔记1-键盘控制开关灯(Point Light)

    Unity学习笔记1-键盘控制开关灯(Point Light) 实现开关灯用键盘上的两个按键控制,效果如下所示 1-创建材质球(Material):HighLight和OffLight **: )Li ...

最新文章

  1. 分享7个我常去的国外AjaxJquery网站
  2. 模型仅1MB,更轻量的人脸检测模型开源,效果不弱于主流算法
  3. 为何多线程就能提高Java程序的执行效率
  4. Linux 下安装python软件包(pip、nose、virtualenv、distribute )
  5. Linux管理磁盘配额
  6. vqa mcb_MCB的完整形式是什么?
  7. MySQL多线程备份工具mydumper
  8. CATIA—机电产品数字化设计工具
  9. sql根据经纬度计算距离
  10. FTP-文件传输协议
  11. 良心教程教你如何使用Excel简单绘制数据图表。
  12. 5. Podspec 文件分析
  13. Java实现 LeetCode 513 找树左下角的值
  14. T5 模型:NLP Text-to-Text 预训练模型+数据清洗
  15. java url参数转map_url参数和map之间的转换
  16. 小程序开发:调用百度文字识别接口实现图文识别,Node.js开发
  17. k近邻算法——kd树
  18. Nginx 之 realip模块 使用详解
  19. 短视频评论的抓取及分析
  20. 使用STC15系列单片机操作sht30

热门文章

  1. DJ2-2 进程管理
  2. 【Qt】QT鼠标和键盘事件
  3. l2高斯分布_L1正则先验是Laplace分布,L2正则先验分布是高斯分布
  4. 中庸----做人的智慧
  5. 【Optimizaition/x86】Intel CPU的CPUID指令获取的C实现
  6. {“errcode“:48001,“errmsg“:“api unauthorized, hints: [ req_id: xxxxxxx]“}
  7. Mesh组网之单线复用与VLAN网口复用
  8. 解决TIM版无法修改个人文件夹位置
  9. Linux开机启动、bashrc、定时任务
  10. Java中带返回值的线程池Future