Cook-Torrance光照模型附 shader代码
这种光照模型是由罗伯特·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代码相关推荐
- 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)
作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...
- yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...
GitHub: liuyuemaicha/PyTorch-YOLOv3github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...
- php 3d animation,css3D+动画的例子(附完整代码)
本篇文章给大家带来的内容是关于css3D+动画的例子(附完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 最近玩了玩用css来构建3D效果,写了几个demo,所以博客总 ...
- GPUImage滤镜中的shader代码分析,及自定义滤镜
from: http://blog.csdn.net/vegerjiangsir/article/details/27172143 GPUImage由于使用GPU,顾其在滤镜染色的时候真正使用的是Op ...
- Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...
linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...
- 从零开始的AI·决策树原来这么好理解(附实例代码)
从零开始的AI系列 从零开始的AI·机器学习の基本概念 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码) 从零开始的AI·朴素贝叶斯?拿来吧你(附实例代码) 文章目录 从零开始的AI系列 前言 ...
- 从零开始的AI·朴素贝叶斯?拿来吧你(附实例代码)
从零开始的AI系列 从零开始的AI·机器学习の基本概念 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码) 从零开始的AI·决策树原来这么好理解(附实例代码) 文章目录 从零开始的AI系列 前言 ...
- 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)
从零开始的AI系列 从零开始的AI·机器学习の基本概念 从零开始的AI·决策树原来这么好理解(附实例代码) 从零开始的AI·朴素贝叶斯?拿来吧你(附实例代码) 文章目录 从零开始的AI系列 前言 一. ...
- MATLAB应用实战系列NSGA-II多目标优化算法原理及应用实例(附MATLAB代码)
前言 NSGA-Ⅱ是最流行的多目标遗传算法之一,它降低了非劣排序遗传算法的复杂性,具有运行速度快,解集的收敛性好的优点,成为其他多目标优化算法性能的基准. NSGA-Ⅱ算法是 Srinivas 和 D ...
最新文章
- python【数据结构与算法】棋盘覆盖问题
- 【成都站参会指南】神策 2020 数据驱动用户大会,邀您面基!
- Eclipse,以及tomcat使用时可能会遇到的几个问题
- 华为硬件工程师社招机考题库_干货:2016年华为中兴硬件工程师笔试题目与经验...
- 二:熟悉 TCP/IP 协议
- websocket使用
- 架构初识之 —— 使用kafka进行商品维度化缓存解决方案
- Linux中brk()系统调用,sbrk(),mmap(),malloc(),calloc()的异同【转】
- pytorch torch.squeeze
- Windows中ElasticSearch的备份和还原
- 下载pyboard的flash中的驱动程序_HASP加密狗驱动程序没有安装成功如何解决
- 零基础如何学习java?
- python基础语法Day11
- Leetcode| 216. 组合总和III、17. 电话号码的字母组合 Day25
- IDC数据中心机房气体灭火系统知识
- 亚马逊买家秀视频怎么上传?上传买家秀视频的作用是什么
- 入手Invicta 8926 OB潜水自动机械腕表
- BCD码-8421码、5421码、2421码、余3码
- 热水结冰比冷水快?半世纪争议终于解开
- 巩膜分割论文:ScleraSegNet: an Improved U-Net Model with Attention for Accurate Sclera Segmentation
热门文章
- 基础安装和配置:搭建Windows离线补丁服务器(Window2016)
- DiscuzX2.5模板样式表-module.css
- 【读书2】【2014】基于MATLAB的雷达信号处理基础(第二版)——多普勒频移(4)
- linux安装错误代码1,gdal安装错误“错误:命令'x86-linux-gnu-gcc'失败,退出状态为1”...
- java+s2sh+mysql音乐网站
- 【调参工具】微软自动调参工具—NNI
- 从 keynote 大神到语雀画图大神,她是怎么做的?
- Day674.Tomcat如何实现一键式启停 -深入拆解 Tomcat Jetty
- 计算机应用技术必须买笔记本吗,网吧里的电脑能买吗?技术员说出真相,能不能买关键要看这三点!...
- 如何获取 Linq 查询结果集合中的索引?