在Webgl中我们使用顶点着色器和片元着色器来为我们的场景创建光照模型。着色器允许我们使用数学模型来控制如何照亮我们的场景。

最好有线性代数的相关知识。

本章中:

  1. 光源、法线、材料
  2. 光照和着色的区别
  3. Goraud Phong着色方法和Lambertian Phong光照模型
  4. 定义并使用uniforms、attributes、varyings
  5. 使用ESSL,webgl的着色器语言
  6. 讨论跟着色有关的webgl api
  7. 继续关于webgl是一个状态机的分析,描述跟着色器相关的可以从状态机中设置和取回的attributes

现实世界中我们能看到物体是因为他们反射光。所有的物体根据他们的 位置 和与光源的相对距离反射的光是不同的,物体表面的 法线 代表表面的方向决定反射光的方向,表面的 材料 决定多少强度的光会被反射。

光源

光源可以具有位置也可以只具有方向。当光源的位置能够影响场景的照亮时他就是点光源。方向光源指的是无论他的位置在哪都将对场景产生相同的光亮效果,如太阳光,这类光源也叫平行光。

点光源通常用一个场景中的点来建模,而平行光通常用向量来代表他的方向,为了简便计算通常用单位向量。

法线

法线是垂直于我们想要照亮的物体表面的向量。法线代表表面的方向因此他们为光源和物体的交互建模中具有决定性作用。

每一个顶点都有一个关联的法向量。

如果一个顶点被多个三角形共享,共享顶点的法向量等于共享顶点在不同的三角形中的法向量的和。N=N1+N2;

法向量为了计算的方便也会标准化成单位向量。

材料

webgl中的物体的材料需要结合他的颜色、纹理等多个参数来建模。材料颜色通常用rgb来表示,材料的纹理与被匹配在物体表面的图像有关。为表面匹配图像的过程叫做纹理贴图。

结合了光照、法线和材料的渲染管线:

上面这张图中,由于法线是定义在顶点-顶点基础上的,因此法线在webgl中被当做VBO来建模并且通过attribute来匹配到顶点坐标VBO。

光和材料使用uniform来传递。uniform可以在顶点着色器和片元着色器中来使用。这给我们的光照模型带来很多灵活性,因为我们既可以计算出光如何在顶点上被反射也可以计算出光光在片元中如何被反射(顶点法线可以通过varyings传递到片元着色器)

attributes和uniforms的区别

1、当一个绘制api(drawArrays、drawElements)被调用时,GPU会并行的加载顶点着色器的多份拷贝。每一份拷贝都会接收到不同的属性集合。这些属性将匹配到VBO并被绘制出来。

2、顶点着色器的所有拷贝中都会受到相同的uniforms,换句话说uniforms在每次绘制调用中都可以认为是常量

上图展示的是gpu并行加载多份顶点着色器和匹配VBO的过程。

一旦光线、法线、材料被传递到程序中去后,下个步骤需要决定用什么样的着色方法和光照模型。

着色方法和光照反射模型

着色和光照两个术语相互间会引起歧义。他们实际上是两个不同的概念,着色指的是让场景中的每个片元得到最终颜色的插值方式。着色的类型定义了在那里计算出最终的颜色(在顶点着色器还是片元着色器中)。一旦着色模型建立后,光照模型决定了法线、材料和光纤如何结合起来产生最终颜色。光照模型使用的是光的物理反射规律。因此在很多书籍中光照模型也被成为反射模型。

着色(插值)方式:

1、Goraud插值;Goraud插值方法在顶点着色器中计算出最终颜色。顶点法线在这里的计算中使用,然后顶点的最终颜色使用varying变量传递到片元着色器中。由于varying变量的在渲染管道中会被自动进行插值,每一个片元的最终颜色是由包含它的封闭三角形的三个顶点颜色决定的。

2、Phong插值;Phong插值在片元着色器中计算出最终颜色。每一个顶点法线通过varying变量沿着顶点着色器传递到片元着色器中。因为varying类型的插值机制被包含在管线中,所以每一个片元都有自己的法线。然后片元法线在片元着色器中来计算出最终颜色。

着色方法不指定每个片元的最终颜色如何计算,它只指定在哪里计算最终颜色和用什么样的插值方式。

光反射模型:

1、Lambertian反射模型

Lambertian反射常用语计算机图形学中为漫反射建模,漫反射指的是入射光朝多个角度反射而不是只朝着一个角度反射(镜面反射)。该条件下光照模型遵循余弦发射模型。Lambertian反射通常使用表面法线和光照方向的负向量的点乘积。然后得到的结果乘以材料颜色和光源颜色。

2、Phong反射模型

在Phong反射模型的描述中,表面反射光由三部分的和:环境光+漫反射+镜面反射。

ambient:代表周围中散乱的光,它是独立于光源的并且在所有片元中都一样

diffuse:描述的是漫反射,通常使用Lambertian模型

specular:镜面反射;理论上讲当我们的视线角度与反射光角度相同时镜面部分得到最大值。这部分可以使用视线向量和反射光向量的点乘积得到。视线向量的起点是片元终点是视点位置(相机位置),反射光方向由入射光根据表面的法线发射得出(essl中有专门的reflect方法计算)。然后点乘积的结果再与一个代表表面发亮的数字做幂运算。而后的结果在乘以光和材料的镜面部分颜色。

最后将环境部分、漫反射部分、镜面部分相加得到片元的最终颜色。

ESSL——OpenGL ES 着色器语言

上面说到没有光的话整个场景就看不到物体,我理解是着色器最终只认gl_color;当物体拥有材质时,如果这时候没有光可能导致gl_color计算值为0x000000;

当没有任何光源的时候,最终的颜色将是黑色,无论材质是什么颜色。

只有蓝色材质才能反射蓝色光

webgl自学笔记——光照的更多相关文章

  1. webgl自学笔记——几何图形

    3D应用的基础元素: 1.canvas,它是渲染场景的占位符.标准html的canvas元素 2.Objects,这里指的是组成一个场景的所有3d实体.这些实体都由三角形组成.webgl中使用Buff ...

  2. webgl自学笔记——矩阵变换

    这章主要探讨矩阵,这些矩阵代表了应用在我们场景上的变换,允许我们移动物体.然而在webGL api中并没有一个专门的camera对象,只有矩阵.好消息是使用矩阵来取代相机对象能让webgl在很多复杂动 ...

  3. webgl自学笔记——深度监测与混合

    这一章中关于webgl中颜色的使用我们将深入研究.我们将从研究颜色在webgl和essl中如何被组装和获取开始.然后我们讨论在物体.光照和场景中颜色的使用.这之后我们将看到当一个物体在另一个物体前面是 ...

  4. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  5. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

  6. 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...

  7. python自学笔记

    python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...

  8. ssh自学笔记

    Ssh自学笔记 Ssh简介 传统的网络服务程序,如:ftp.pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据.而且,这些服务 ...

  9. JavaScript高级程序设计之自学笔记(一)————Array类型

    以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...

随机推荐

  1. Android Weekly Notes Issue #258

    Android Weekly Issue #258 May 21st, 2017 Android Weekly Issue #258 本期内容: 围绕着Google I/O的热潮, 本周的posts除 ...

  2. spring.handlers、spring.schemas、spring.tooling被覆盖的三种解决方式

    在用到spring时,本地IDE里面跑的很正常,但是打jar包后在集群上运行时报错. 查找资料后确定了问题的根源,由于在依赖中调用了spring的许多包,每个包都有自己的spring.schemas文 ...

  3. 二分查找(binary search)

    二分查找又叫折半查找,要查找的前提是检索结果位于已排序的列表中. 概念 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是 ...

  4. 详解python之反射机制

    一.前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = 1 t ...

  5. HTTP协议入门

    1.概述 (1)HTTP是应用层协议,是从Web服务器传输超文本到本地浏览器的传送协议,端口号为80.(2)默认情况下HTTP使用TCP,但是也可以基于以后存在的其他可靠传输协议.由于UDP无法提供可 ...

  6. Tomcat7配置管理员帐号密码及权限

    在使用tomcat时,若要使用管理监控功能,需要用用户名密码登录使用,而tomcat7默认是将用户是注释的,所以需要配置后使用, 配置文件为根目录下的/conf/tomcat-users.xml文件. ...

  7. 工程师倾情奉献-Win7 ISO 精简操作说明

    1.前提条件 a)本文档内容只适用于32bit win7 install ISO,其它OS不能保证兼容 b)示范文件为win7-ultimate-rtm-32-en-us-rdvd.iso 2.准备待 ...

  8. 如何使用wait(), notify() and notifyAll() – Java

    Java多线程是个很复杂的问题,尤其在多线程在任何给定的时间访问共享资源需要更加注意.Java 5引入了一些类比如BlockingQueue 和Executors 类提供了易于使用的API,避免了一些 ...

  9. android消息推送(Jpush)

    一.我采用极光推送Jpush进行消息推送,完成一定时间给应用发送消息 二.开发步骤 1.下载Jpush的SDK 2.注册用户和应用,获取APPKey和 Master Secret 3-1.将SDK的l ...

  10. Swing系列之控件一

    Swing系列之控件 JTextArea JTextArea是一个实现多行文本的控件 构造函数 JTextArea() 构造新的TextArea. JTextArea(Document doc) 构造 ...