0.光照处理时候,向量点乘一定要是标准化后的单位向量!!!

1.冯氏光照模型:光照=环境光+漫反射+镜面反射

    vec3 result = ambient + diffuse + specular;

一般每一项的计算又分为几个小部分  partLight = S * K * M * O;

S指光源颜色,K指这部分光照的显示强度(一般来说环境光强度最弱,系数最小,镜面反射最大,漫反射居中),M指的是影响系数(由各种夹角计算出来,环境管不管,漫反射由入射向量和法线向量点积而得,但是注意是标准化后的向量,镜面先取反射向量,再和观察视线点积,也要注意单位向量的问题),O指的是物体本身的颜色(一般为纹理贴图的颜色),这一项其实也就是我们常说的材质materia

2.物体的材质materia实际上可以简单地理解为物体的贴图,也就是他所展示出来的颜色信息。其中有又分为漫反射贴图和镜面反射贴图。他们在相同光照下所反射的颜色不同

这两张图片一个是漫反射的贴图,一个是镜面反射贴图。他们都要加到同一个箱子上,然后渲染。第一个负责环境光和漫反射部分,后者负责镜面反射部分。这样才能将箱子四周的钢铁的镜面反射效果表现出来

3.光照模型其实也分为好多种:平行光(又叫定向光direction light)、点光源(point light)、聚光(spotlight),每种具体的光源渲染细节不同,但是大概结构相似,都满足1中的基本模型解释,只不过在细节和逼真度方面做了调整。具体参看https://learnopengl-cn.github.io/02%20Lighting/05%20Light%20casters/

4.三种不同光照模型的片元着色器跟顶点着色器代码见另一篇博客:https://www.cnblogs.com/guopinghai/p/9817847.html,具体完整代码可参见我的git:https://github.com/guopeiming/learnOpenGL/tree/master/exerciseCode/forth_light

openGL学习----光照的更多相关文章

  1. OpenGL学习进程(11)第八课:颜色绘制的详解

        本节是OpenGL学习的第八个课时,下面将详细介绍OpenGL的颜色模式,颜色混合以及抗锯齿.     (1)颜色模式: OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. R ...

  2. OpenGL学习之路(一)

    1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...

  3. OpenGL学习之路(三)

    1 引子 这些天公司一次次的软件发布节点忙的博主不可开交,另外还有其它的一些事也占用了很多时间.现在坐在电脑前,在很安静的环境下,与大家分享自己的OpenGL学习笔记和理解心得,感到格外舒服.这让我回 ...

  4. OpenGL学习进程(4)第二课:绘制图形

    本节是OpenGL学习的第二个课时,下面介绍如何用点和线来绘制图形:     (1)用点的坐标来绘制矩形: #include <GL/glut.h> void display(void) ...

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

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

  6. OpenGL学习进程(12)第九课:矩阵乘法实现3D变换

    本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈.     (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...

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

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

  8. OpenGL学习之路(四)

    1 引子 上次读书笔记主要是学习了应用三维坐标变换矩阵对二维的图形进行变换,并附带介绍了GLSL语言的编译.链接相关的知识,之后介绍了GLSL中变量的修饰符,着重介绍了uniform修饰符,来向着色器 ...

  9. OpenGL学习之路(五)

    1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...

随机推荐

  1. ubuntu中python3安装package

    1.实验环境 Ubuntu16.04x86 + python3.5 ubuntu中同时存在python2.7 和 python3.5 2.pip使用说明 sudo pip install packag ...

  2. HTML禁止右键复制【两行代码实现】

    很多的站长朋友会考虑保护网站的内容不被人复制,或者是不被人轻易的复制,下面就来告诉如何用两行代码来做HTML禁止右键复制html的方法: document.oncontextmenu=new Func ...

  3. 1.7 flask 的组件 wtfroms使用

    2019-1-7 17:59:37 还有两天左右flask就结束啦!昨晚逛了一下吾爱破解还有慕课,发现有三个意外项目, Django生鲜项目,flask电影网站项目,vue美团网项目,都保存百度云啦, ...

  4. package.json文件配置信息

    1.概述 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文 ...

  5. C++ main函数的参数

    C++的main函数可以没有输入参数,也可以有输入参数,而且只能有两个参数,习惯上coding如下: int main(int argc, char* argv[]) 或者 int main(int ...

  6. Palindromic Matrix

    Palindromic Matrix time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. IIS多个应用程序共享Session

    在应用程序目录下面添加一个Global.asax文件,在文件中添加以下代码: public override void Init() { base.Init(); foreach (string mo ...

  8. Spring Enable* 注解

    Spring提供了一系列以Enable开头的注解,这些注解本质上是激活Spring的某些管理功能.比如,EnableWebMvc. 这个注解引入了MVC框架在Spring 应用中需要用到的所有bean ...

  9. python中的*args和**kw

    学习python装饰器decorator的时候遇到*args和**kw两种函数值传递. 在python中定义函数,可以使用一般参数.默认参数.非关键字参数和关键字参数. 一般参数和默认参数在前面的学习 ...

  10. mybatis+oracle实现简单的模糊查询

    第一种 concat select * from cat_table where cat_name like concat(#{catName},'%') --单个百分号 select * from ...