WebGL编程指南理论分析之物体的运动和点光源
之前的所有案例中物体都是静止的并且是平行光照射,这里我们来讨论一下运动物体和点光源。
一、运动物体
我们知道对于一个提供原始顶点坐标和原始顶点法向量数据的着色器绘制出来的图形看上去是这样的:

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

立体感全无,这是因为没有对光线做出反映。
通过前面的学习,我们知道,
①在平行光下:最终颜色(漫反射光颜色 )= 入射光线颜色 x 表面基底色 x (光线方向 · 法线方向)
顶点着色器变量:物体基色、光线颜色、点的法向量、归一化的光线坐标
当物体运动的时候,上述有一个参数会变化,那就是顶点的法向量,那么如何求得运动后的顶点法向量呢?
物体运动是依靠模型矩阵实现的;
②运动后的顶点法向量 = 变化之前的法向量(初始数据给的法向量) x 模型矩阵的逆转置矩阵;
对于逆转置矩阵:
M的逆矩阵R,M * R = R * M = 单位矩阵;
转置就是一个矩阵行列互换。
二、点光源
这时候,因为是点光源,所以,光线的方向,就依靠光源点坐标和顶点坐标计算获得:
光线方向 = 点光源世界坐标 - 顶点世界坐标,然后归一化;
其中顶点的世界坐标 = 模型矩阵 x 顶点坐标。
有了光线方向之后,其余和上面步骤无异。
光源产生的漫反射光 = 光源颜色 x 顶点颜色 x (光线方向 · 法线方向);
此时如果还有环境光,那么:
环境光产生的反射光 = 环境光 x 顶点颜色;
最终颜色 = 两种颜色相加(注意要加上alpha通道值)
三、逐片元光照
为了效果更加逼真,可以将上述颜色的计算放在片元着色器中进行,效果对比如下:


很显然,右侧的逐片元计算更加自然。
WebGL编程指南理论分析之物体的运动和点光源的更多相关文章
- WebGL编程指南理论分析之物体层次模型(局部运动)
书中340页,开始讲到层次模型(关节模型),也就是整个物体,可以自由控制其各部位单独运动,就像关节一样,互不干扰或者有一定关联. 就像图中,左右键控制整个物体(arm1和arm2)的Y轴旋转,上下键控 ...
- 【WebGL】《WebGL编程指南》读书笔记——第6章
一.前言 最近重感冒发烧,妈蛋好难受,请假了3天,驾校也没去,简直僵硬!今天继续WebGL的学习. 二.正文 A. GLSL支持两种数据值类型: 整数型(int)与浮点型( ...
- 【WebGL】《WebGL编程指南》读书笔记——第5章
一.前言 终于到了第五章了,貌似开始越来越复杂了. 二.正文 Example1:使用一个缓冲区去赋值多个顶点数据(包含坐标及点大小) function initVerte ...
- 【WebGL】《WebGL编程指南》读书笔记——第3章
一.前言 根据前面一章的内容,继续第三章的学习. 二.正文 一起绘制三个点,这里要使用到缓存了 var n = initVertexBuffers(gl); //返回绘制点的个数 n ) ...
- 【WebGL】《WebGL编程指南》读书笔记——第2章
一.前言 最近看了<WebGL编程指南>这本书,发现还是很有意思的,故每章阅读后做个笔记. 二.正文 Example1:在canvas中绘制矩形 <!DOCTYPE html> ...
- WebGL编程指南案例解析之平移和旋转的矩阵实现
手写各种矩阵: //矩阵 var vShader = ` attribute vec4 a_Position; uniform mat4 u_xformMatrix; void main(){ gl_ ...
- WebGL编程指南案例解析之绘制一个点
<!DOCTYPE html> <html> <head> <title>webgl</title> <style type=&quo ...
- WebGL编程指南案例解析之3D视图视区问题
var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'attribute vec4 a_Color;\n' + 'uniform mat4 u_ ...
- WebGL编程指南高级技术篇(常见需求的处理)
一.鼠标控制模型旋转 实质的根据鼠标移动前后的位置比较得出x,y轴的旋转角度: 图中是一个屏幕,有一个模型(恩,他是一个模型),鼠标由P点移动到P1点,我们假定移动单位步长旋转β角度: P(x1,y1 ...
随机推荐
- UVa 1252 20个问题
https://vjudge.net/problem/UVA-1252 题意: 有n个物体,m个特征.每个物体用一个m位01串表示,表示每个特征是具备还是不具备.我在心里想一个物体,由你来猜. 你每次 ...
- c++ 容器填充指定长度(fill_n)
#include <iostream> // cout #include <algorithm> // fill_n #include <vector> // ve ...
- windows服务部署
1.新建windows服务项目 2.编辑业务代码 我这里只写2句记录文本的测试代码 using System; using System.IO; using System.ServiceProcess ...
- RabbitMQ入门_11_DLX
参考资料:https://www.rabbitmq.com/dlx.html 队列中的消息可能会成为死信消息(dead lettered).让消息成为死信消息的事件有: 消息被取消确认(nack 或 ...
- 怎么运行cocos2dx 3.x simulator?
1.simulator的好处是: 快速切换分辨率:F5快速重新启动项目: 这对于脚本语言来说都是很方便快捷的. 2.涉及到显示参数的文件有两个: ①lang,这个是菜单的语言文件,如果没有这个文件的话 ...
- C# Interface中的属性
只能写get,和set,到具体类实现的时候才确定get的是哪个字段的值,set的是哪个字段的值.
- R语言-attach、detach、with
在R语言中,对于串列,数据框中的数据的进行操作时,为了避免重复地键入对象名称,可使用attach或with. 1.attach() 假设data.frame包含列name,age attach(one ...
- Java 本地环境设置
如果你希望在你的本地环境中设置 Java 程序环境,下面的这部分将会指导你在你的本地计算机上下载和设置 Java 环境.你可以按照下面的步骤进行. Java SE 目前是免费下载的,你可以通过单击下面 ...
- Jersey 2.x 服务器端应用支持的容器
基于 JAX-RS Servlet-based 部署的一部分标准,能运行在任何支持 Servlet 2.5 和更高标准的的容器上.Jersey 提供支持程序化部署在下面的容器中:Grizzly 2 ( ...
- hdu-2227-dp+bit
Find the nondecreasing subsequences Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/3 ...