这个笔记只是冯氏光照模型下漫反射光以及镜面光照的计算方式的笔记

基础光照

基础光照分为环境光,漫反射光,镜面光照

环境光

环境光是一个常量,表示在没有光源的情况下物体的光

漫反射光

漫反射光分量的计算方式

将顶点的法向量标准化

将片段到光源的方向向量标准化

vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);

normlightDir向量进行点乘,计算光源对当前片段实际的漫反射影响,乘上光的颜色,得到漫反射分量,当法线和方向向量大于90度时,这个片段不会被光源照到,点乘得出来一个负值,但颜色不能是负值,所以要和0取最大

float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;

如果只要环境光和漫反射光的话,得到的最终的结果是环境光加上漫反射光乘上物体的颜色,得到最后的颜色

 vec3 result = (ambient + diffuse) * objectColor;
FragColor = vec4(result, 1.0);

镜面光

镜面光分量的计算方式

同样要获得顶点的法向量

先获得光源到片段的方向向量,将这个向量标准化

vec3 lightDir = normalize(lightPos - FragPos);

获得摄像机到片段的向量

使用reflect函数,将片段指向光源的向量和法向量作为参数传进去,得到一个反射向量

vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);

再计算反射向量和摄像机到片段的向量的点乘和0的最大值的32次幂

float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * lightColor;

32指的是反光度(Shiness),反光度越高,反射光能力越强

基础光照输出

把环境光,漫反射光,镜面光三个分量相加,乘上物体的颜色,得到最终的颜色

vec3 result = (ambient + diffuse + specular) * objectColor;
FragColor = vec4(result, 1.0);

OpenGL学习笔记(6) 基础光照的计算方法的更多相关文章

  1. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  2. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  3. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  4. bootstrap学习笔记之基础导航条 http://www.imooc.com/code/3111

    基础导航条 在Bootstrap框中,导航条和导航从外观上差别不是太多,但在实际使用中导航条要比导航复杂得多.我们先来看导航条中最基础的一个--基础导航条. 使用方法: 在制作一个基础导航条时,主要分 ...

  5. Django学习笔记(基础篇)

    Django学习笔记(基础篇):http://www.cnblogs.com/wupeiqi/articles/5237704.html

  6. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  7. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  8. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  9. MAVEN学习笔记之基础(1)

    MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...

随机推荐

  1. 【Alpha】Daily Scrum Meeting——blog3

    团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 2. 每个人的工作 姓名 已完成工作 计划完成工作 遇到的困 ...

  2. RabbitMQ学习以及与Spring的集成(一)

    本文记录RabbitMQ服务的搭建过程. 想要使用RabbitMQ消息中间件服务.首先要安装RabbitMQ,可以在:https://www.rabbitmq.com/download.html根据安 ...

  3. 使用FASTJSON做反序列化的时间格式处理

    JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.mmm"; Productorder tmp1 = JSONObj ...

  4. java 解析json字符串

    如果转载我的这篇文章请注明出处,谢谢! 最近工作中,需要解析json格式的字符串,恰好有个例子,感觉不错,拿来分享. 运行这个类需要加载jar包:ezmorph-1.0.6.jar.json-lib- ...

  5. [luogu3942] 将军令

    题面 ​ 题目的意思大概是给你一棵n个点的树, 求最少需要多少个多少个点, 整棵树都被覆盖(覆盖的意思是所有离被选中的点距离不大于k的点都视作已覆盖). ​ 考虑贪心(其实我考试的时候以为是道树形dp ...

  6. linq to sql 分页技术

    昨天在用LINQ写分页的时候碰到一个很奇怪的问题:翻页的时候,有的数据会莫名其妙地消失,查了半个多小时才发现问题所在,其实是一个很细节的地方. 数据表如下: LINQ分页的实现是: var artic ...

  7. 集合之List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  8. selenium3驱动IE浏览器设置

    前言: 使用selenium3+IE11的方式进行自动化测试 准备工作: 1.ie的驱动:IEDriverServer.exe(对应系统位数) 2.已安装好python3.selenium所需的相关服 ...

  9. JIRA使用方法,简易图解

          我们公司要用版本控制(SVN)和过程管理(JIRA)相配合开发软件,所以两个都得用喽!     JIRA是集项目计划.任务分配.需求管理.错误跟踪于一体的商业软件.JIRA创建的问题类型包 ...

  10. python logging模块按天滚动简单程序

    简单日志按天滚动,加入apsheduler,用crontab模式按小时运行测试: import logging from logging.handlers import TimedRotatingFi ...