之前的所有案例中物体都是静止的并且是平行光照射,这里我们来讨论一下运动物体和点光源。

一、运动物体

我们知道对于一个提供原始顶点坐标原始顶点法向量数据的着色器绘制出来的图形看上去是这样的:

看上去很有立体感,但是如果把颜色去掉之后:

立体感全无,这是因为没有对光线做出反映。

通过前面的学习,我们知道,

①在平行光下:最终颜色(漫反射光颜色 )= 入射光线颜色 x 表面基底色 x (光线方向 · 法线方向)

  顶点着色器变量:物体基色、光线颜色、点的法向量、归一化的光线坐标

当物体运动的时候,上述有一个参数会变化,那就是顶点的法向量,那么如何求得运动后的顶点法向量呢?

物体运动是依靠模型矩阵实现的;

②运动后的顶点法向量 = 变化之前的法向量(初始数据给的法向量) x 模型矩阵的逆转置矩阵;

对于逆转置矩阵:

M的逆矩阵R,M * R = R * M = 单位矩阵;

转置就是一个矩阵行列互换。

二、点光源

这时候,因为是点光源,所以,光线的方向,就依靠光源点坐标和顶点坐标计算获得:

光线方向 = 点光源世界坐标 - 顶点世界坐标,然后归一化;

其中顶点的世界坐标 = 模型矩阵 x 顶点坐标。

有了光线方向之后,其余和上面步骤无异。

光源产生的漫反射光 = 光源颜色 x 顶点颜色 x (光线方向 · 法线方向);

此时如果还有环境光,那么:

环境光产生的反射光 = 环境光  x  顶点颜色;

最终颜色 = 两种颜色相加(注意要加上alpha通道值)

三、逐片元光照

为了效果更加逼真,可以将上述颜色的计算放在片元着色器中进行,效果对比如下:

很显然,右侧的逐片元计算更加自然。

WebGL编程指南理论分析之物体的运动和点光源的更多相关文章

  1. WebGL编程指南理论分析之物体层次模型(局部运动)

    书中340页,开始讲到层次模型(关节模型),也就是整个物体,可以自由控制其各部位单独运动,就像关节一样,互不干扰或者有一定关联. 就像图中,左右键控制整个物体(arm1和arm2)的Y轴旋转,上下键控 ...

  2. 【WebGL】《WebGL编程指南》读书笔记——第6章

    一.前言        最近重感冒发烧,妈蛋好难受,请假了3天,驾校也没去,简直僵硬!今天继续WebGL的学习. 二.正文        A. GLSL支持两种数据值类型: 整数型(int)与浮点型( ...

  3. 【WebGL】《WebGL编程指南》读书笔记——第5章

    一.前言        终于到了第五章了,貌似开始越来越复杂了. 二.正文         Example1:使用一个缓冲区去赋值多个顶点数据(包含坐标及点大小) function initVerte ...

  4. 【WebGL】《WebGL编程指南》读书笔记——第3章

    一.前言 根据前面一章的内容,继续第三章的学习. 二.正文       一起绘制三个点,这里要使用到缓存了 var n = initVertexBuffers(gl); //返回绘制点的个数 n ) ...

  5. 【WebGL】《WebGL编程指南》读书笔记——第2章

    一.前言 最近看了<WebGL编程指南>这本书,发现还是很有意思的,故每章阅读后做个笔记. 二.正文 Example1:在canvas中绘制矩形 <!DOCTYPE html> ...

  6. WebGL编程指南案例解析之平移和旋转的矩阵实现

    手写各种矩阵: //矩阵 var vShader = ` attribute vec4 a_Position; uniform mat4 u_xformMatrix; void main(){ gl_ ...

  7. WebGL编程指南案例解析之绘制一个点

    <!DOCTYPE html> <html> <head> <title>webgl</title> <style type=&quo ...

  8. WebGL编程指南案例解析之3D视图视区问题

    var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'attribute vec4 a_Color;\n' + 'uniform mat4 u_ ...

  9. WebGL编程指南高级技术篇(常见需求的处理)

    一.鼠标控制模型旋转 实质的根据鼠标移动前后的位置比较得出x,y轴的旋转角度: 图中是一个屏幕,有一个模型(恩,他是一个模型),鼠标由P点移动到P1点,我们假定移动单位步长旋转β角度: P(x1,y1 ...

随机推荐

  1. UVa 1631 密码锁

    https://vjudge.net/problem/UVA-1631 题意: 有一个n位密码锁,每位都是0~9,可以循环旋转.每次可以让1~3个相邻数字同时往上或者往下转一格.输入初始状态和终止状态 ...

  2. Codeforces Round #289 (Div. 2, ACM ICPC Rules) E. Pretty Song 算贡献+前缀和

    E. Pretty Song time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. MVC扩展Url.Action方法解决复杂对象参数问题

    1:问题描述 @Url.Action("Index", "Home", new { Key = "Key", Val = new { Nam ...

  4. 删除node_modules

    // 删除node_modules $ rm -rf node_modules

  5. iterator_教程中的讲解

    ZC: 在讲 vector的时候讲到的 1.分类: (1).输入(只读) 只支持一遍算法 (2).输出(只写) 只支持一遍算法 (3).正向 可对一个值进行多次读写 ==> 相当于 输入迭代器+ ...

  6. spring boot开发 @autowired注入失败

    @autowired注入失败 会出现如下错误提示: 2018-05-28 08:39:41.857 INFO 8080 --- [ restartedMain] org.hibernate.Versi ...

  7. 《剑指offer》第十二题(矩阵中的路径)

    // 面试题:矩阵中的路径 // 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 // 字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右. // 上.下移动 ...

  8. js 去重

        function unique(array) { let obj = {}; return array.filter((item, index, array) => { let newI ...

  9. robot脚本编写规范

    一个robot脚本主要有四部分组成: ***settings*** 设置 ***keywords*** 关键词 ***variables*** 变量 ***test cases*** 测试用例 一般, ...

  10. MyBatis3-基于注解的示例

    在基于注解的示例中,可以简化编写XML的过程,全部采用注解方式进行编写,并在注解上写SQL语句,语句和XML的语句保持一致,并且可以省略掉XML文件不用引入的好处.但还有一点,基于注解的方式还没有百分 ...