这种光照模型是由罗伯特·L·库克和Kenneth E.托兰斯的发展。库克-托兰斯模型更接近比的Phong或的Blinn-的Phong模型的物理现实。它是用来模拟不同材料的镜面反射。该模型将每个表面由许多微小面:非常小的方面,反映了入射光。在粗糙表面上,这些微小面的斜坡变化很大,并且在光滑表面的微小面以类似的方向上取向(如在1967年由托兰斯-麻雀描述)。

因为在大多数的光照模型,反射由环境,漫反射和镜面反射和朗伯(的ñ · 用于漫反射)。该模型,而不是集中在镜面反射。下面的公式示出了基本的反射模型(以简化的形式库克&托兰斯(1982)的原配方见。):

其中,ķ ]是漫反射的光的分数(0之间的值和1)和- [R 小号是镜面反射分量,这样计算:

这种镜面反射取决于三个因素:该菲涅耳˚F),所述粗糙度(=微小面的方向分布,ð)和几何衰减ģ)。

菲涅尔

菲涅尔因子定义了入射光的分数被反射,哪一部分被发送。在我所见过的石里克近似的例子着色器代替原有的配方,因为原来的菲涅耳公式太耗费计算。见库克 - 托兰斯(1982年)为全面菲涅耳公式。

石里克(1994)做了菲涅耳公式的近似值来获得类似的结果具有更快的计算。他的公式是这样的:

˚F λ是在法向入射的反射率,是光矢量和ħ是光矢量和朝向观看者指向的向量之间的半向量。

粗糙度(微面分布)

这个因素定义了以相同的方式(=作为法线矢量指向相同的方向),为的中途矢量定向微小面的分数v。上光滑的表面,所有微小面具有相似的方向,因此,所有的反射光接近反射载体。在粗糙的表面,光线分布更加广泛。

计算所述分布的一个方法是使用Beckmanns(1963)分布函数:

其中是控制表面的粗糙度的变量。

几何衰减

在到达表面之前或反射后一些微小面遮挡入射光。的几何衰减因子是从0到1的值,表示保持此遮蔽或掩蔽已经发生后的光的比例量。该计算假定所有微小面具有V形槽的形式。

因此有三种情况的光与表面的反应:(a)该光被反射而不干扰,(二)部分的反射光被反射和(c)一些光到达下一个微面之前被阻塞后阻止(TODO:添加图片)。

在第一种情况下,到达观看者的光1.第二种情况的公式为:

对于第三种情况的公式是一样的第二种情况,但与v交换:

的几何衰减因子计算为最小下列三个值:

几何衰减计算在详细的Blinn(1977)中所述。

precision highp float; //set default precision in glsl es 2.0uniform vec3 lightDirection;varying vec3 varNormal;
varying vec3 varEyeDir;void main()
{// set important material valuesfloat roughnessValue = 0.3; // 0 : smooth, 1: roughfloat F0 = 0.8; // fresnel reflectance at normal incidencefloat k = 0.2; // fraction of diffuse reflection (specular reflection = 1 - k)vec3 lightColor = vec3(0.9, 0.1, 0.1);// interpolating normals will change the length of the normal, so renormalize the normal.vec3 normal = normalize(varNormal);// do the lighting calculation for each fragment.float NdotL = max(dot(normal, lightDirection), 0.0);float specular = 0.0;if(NdotL > 0.0){vec3 eyeDir = normalize(varEyeDir);// calculate intermediary valuesvec3 halfVector = normalize(lightDirection + eyeDir);float NdotH = max(dot(normal, halfVector), 0.0); float NdotV = max(dot(normal, eyeDir), 0.0); // note: this could also be NdotL, which is the same valuefloat VdotH = max(dot(eyeDir, halfVector), 0.0);float mSquared = roughnessValue * roughnessValue;// geometric attenuationfloat NH2 = 2.0 * NdotH;float g1 = (NH2 * NdotV) / VdotH;float g2 = (NH2 * NdotL) / VdotH;float geoAtt = min(1.0, min(g1, g2));// roughness (or: microfacet distribution function)// beckmann distribution functionfloat r1 = 1.0 / ( 4.0 * mSquared * pow(NdotH, 4.0));float r2 = (NdotH * NdotH - 1.0) / (mSquared * NdotH * NdotH);float roughness = r1 * exp(r2);// fresnel// Schlick approximationfloat fresnel = pow(1.0 - VdotH, 5.0);fresnel *= (1.0 - F0);fresnel += F0;specular = (fresnel * geoAtt * roughness) / (NdotV * NdotL * 3.14);}vec3 finalValue = lightColor * NdotL * (k + specular * (1.0 - k);gl_FragColor = vec4(finalValue, 1.0);
}

Cook-Torrance光照模型附 shader代码相关推荐

  1. 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

    作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...

  2. yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...

    GitHub: liuyuemaicha/PyTorch-YOLOv3​github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...

  3. php 3d animation,css3D+动画的例子(附完整代码)

    本篇文章给大家带来的内容是关于css3D+动画的例子(附完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 最近玩了玩用css来构建3D效果,写了几个demo,所以博客总 ...

  4. GPUImage滤镜中的shader代码分析,及自定义滤镜

    from: http://blog.csdn.net/vegerjiangsir/article/details/27172143 GPUImage由于使用GPU,顾其在滤镜染色的时候真正使用的是Op ...

  5. Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...

    linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...

  6. 从零开始的AI·决策树原来这么好理解(附实例代码)

    从零开始的AI系列 从零开始的AI·机器学习の基本概念 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码) 从零开始的AI·朴素贝叶斯?拿来吧你(附实例代码) 文章目录 从零开始的AI系列 前言 ...

  7. 从零开始的AI·朴素贝叶斯?拿来吧你(附实例代码)

    从零开始的AI系列 从零开始的AI·机器学习の基本概念 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码) 从零开始的AI·决策树原来这么好理解(附实例代码) 文章目录 从零开始的AI系列 前言 ...

  8. 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)

    从零开始的AI系列 从零开始的AI·机器学习の基本概念 从零开始的AI·决策树原来这么好理解(附实例代码) 从零开始的AI·朴素贝叶斯?拿来吧你(附实例代码) 文章目录 从零开始的AI系列 前言 一. ...

  9. MATLAB应用实战系列NSGA-II多目标优化算法原理及应用实例(附MATLAB代码)

    前言 NSGA-Ⅱ是最流行的多目标遗传算法之一,它降低了非劣排序遗传算法的复杂性,具有运行速度快,解集的收敛性好的优点,成为其他多目标优化算法性能的基准. NSGA-Ⅱ算法是 Srinivas 和 D ...

最新文章

  1. python【数据结构与算法】棋盘覆盖问题
  2. 【成都站参会指南】神策 2020 数据驱动用户大会,邀您面基!
  3. Eclipse,以及tomcat使用时可能会遇到的几个问题
  4. 华为硬件工程师社招机考题库_干货:2016年华为中兴硬件工程师笔试题目与经验...
  5. 二:熟悉 TCP/IP 协议
  6. websocket使用
  7. 架构初识之 —— 使用kafka进行商品维度化缓存解决方案
  8. Linux中brk()系统调用,sbrk(),mmap(),malloc(),calloc()的异同【转】
  9. pytorch torch.squeeze
  10. Windows中ElasticSearch的备份和还原
  11. 下载pyboard的flash中的驱动程序_HASP加密狗驱动程序没有安装成功如何解决
  12. 零基础如何学习java?
  13. python基础语法Day11
  14. Leetcode| 216. 组合总和III、17. 电话号码的字母组合 Day25
  15. IDC数据中心机房气体灭火系统知识
  16. 亚马逊买家秀视频怎么上传?上传买家秀视频的作用是什么
  17. 入手Invicta 8926 OB潜水自动机械腕表
  18. BCD码-8421码、5421码、2421码、余3码
  19. 热水结冰比冷水快?半世纪争议终于解开
  20. 巩膜分割论文:ScleraSegNet: an Improved U-Net Model with Attention for Accurate Sclera Segmentation

热门文章

  1. 基础安装和配置:搭建Windows离线补丁服务器(Window2016)
  2. DiscuzX2.5模板样式表-module.css
  3. 【读书2】【2014】基于MATLAB的雷达信号处理基础(第二版)——多普勒频移(4)
  4. linux安装错误代码1,gdal安装错误“错误:命令'x86-linux-gnu-gcc'失败,退出状态为1”...
  5. java+s2sh+mysql音乐网站
  6. 【调参工具】微软自动调参工具—NNI
  7. 从 keynote 大神到语雀画图大神,她是怎么做的?
  8. Day674.Tomcat如何实现一键式启停 -深入拆解 Tomcat Jetty
  9. 计算机应用技术必须买笔记本吗,网吧里的电脑能买吗?技术员说出真相,能不能买关键要看这三点!...
  10. 如何获取 Linq 查询结果集合中的索引?