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

一、运动物体

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

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

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

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

①在平行光下:最终颜色(漫反射光颜色 )= 入射光线颜色 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. Python time模块详解--转载

    1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所 ...

  2. AtCoder Grand Contest 013 C :Ants on a Circle

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. Cocos2d-x学习笔记(八)精灵对象的创建

    精灵类即是Sprite,它实际上就是一张二维图. 它首先直接继承了Node类,因此,它具有节点的特征,同时,它也直接继承了TextureProtocol类,因此,它也具有纹理的基本特征. 这里,有必要 ...

  4. 警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

    加入 import os os.environ[' demo: import os os.environ[' import tensorflow as tf tf.enable_eager_execu ...

  5. 文件上传allowedTypes和文件下载contentType(mimeType)

    我们在做文件上传和下载时,常常要用到以下mimeType,下面列出来供大家参考参考!希望多顶顶 '.a'      : 'application/octet-stream',        '.ai' ...

  6. [框架模式]经典的模型视图控制器模式MVC

    参考:<设计模式> http://blog.csdn.net/u010168160/article/details/43150049 百度百科 引言: Model(模型)是应用程序中用于处 ...

  7. [ios]cocos2dx获取设备的当前预言

    参考:http://blog.sina.com.cn/s/blog_923fdd9b0101fmpv.html http://bbs.9ria.com/thread-199313-1-1.html / ...

  8. 很火的Java题——判断一个整数是否是奇数

    完成以下代码,判断一个整数是否是奇数: public boolean isOdd(int i) 看过<编程珠玑>的人都知道这道题的答案和其中极为简单的道理. 最普遍的风格,如下: 这个函数 ...

  9. java中的值传递和引用传递用法详解

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对 ...

  10. css 键盘

    <html lang="en"> <head> <meta charset="UTF-8"> <title>Do ...