webgl之五彩光源
一、Three.js中有哪些光源?
在Three.js中,光源有一个基类THREE.Light(hex),这个hex接受16进制颜色作为参数而初始化光源的颜色,比如我们要定义一种绿色的光源,可以这样来定义:
var greenLight = new THREE.Light(0x00FF00);
而作为3d引擎three.js,这个基类是很难满足我们的要求的,所以,我们还需要继承这个基类的更多样化的光源:

即除了这个基类光源之外,我们还有环境光、区域光、方向光、聚光灯、点光源等等。下面我们介绍一些常用的光源。
(1)环境光
环境光是经过多次反射而来的光,所以无法确定其最初的方向。 它是一种无处不在的光,其光源可以认为是来自任何方向。所以,当我们制定场景光源为环境光时,所有的物体都会表现出同样的明暗程度,环境光可以用 THREE.AmbientLight 来表示,他的构造函数即为 THREE.AmbientLight(hex); ,它仍然接受16进制颜色作为参数,如下:
var light = new THREE.AmbientLight(0xff00000);
scene.add(light);
如上,加入光源之后,场景就能够通过光源渲染出效果了。
(2)点光源
由这种光源放出的光线是来自同一点的,且方向是辐射到四面八方的。比如家里灯泡就是一个点光源。构造函数如下:
var light = new THREE.PointLight(color, intensity, distance);
- color,即光的颜色。
- intensity,即光的强度,取值在0到1之间,默认是1.0,即强度最高。
- distance,即光的距离,从光源所在的位置,经过distance转举例之后,光的强度将从Intensity衰减为0. 默认情况下这个值为0.0,表示光源强度不衰减。
(3)聚光灯
这种光源的光线从一个椎体中射出,在被照射的物体上产生聚光的效果,使用这种光源需要指定光的射出方向以及椎体的顶角α,如下:

我们可以使用如下构造函数:
var light = nwe THREE.SpotLight(hex, intensity, distance, angle, exponent);
- hex就是聚光灯的16进制颜色。
- Intensity同样是光源的强度。
- distance是光源强度从设定到0的举例,默认为0,即光不衰减。
- Angle是聚光灯着色的角度,用弧度作为单位。
- exponent是光源模型中衰减的一个参数,这个参数值越大,则衰减越快。
(4)平行光
平行光又称为方向光(Directional Light),是一组没有衰减的平行额光线,类似太阳光的效果,
构造函数如下所示:
var lignt = new THREE.DirectionalLight(hex, intensity);
其中,Hex就是光的颜色,而Intensity就是光的千古。
二、光源和材质的关系
我们在屏幕上画一个物体,不带任何的光源,定义物体的颜色为黑色,其值为0x000000,定义材质如下:
var material = new THREE.MeshLambertMaterial( { color:0x000000} ); // 这是兰伯特材质,材质中的一种
那么最终的效果就是什么也看不到。并且实际上我们可以得到从这里并不那么容易可以得到的结论:
如果在没有任何光源的情况下,最终的颜色都将是黑色,无论材质是什么颜色。 所以说在白天时,我们看到的物体的颜色实际上是物体没能吸收的颜色,我们才看到了,而黑夜情况下,物体什么都吸收不了,自然我们什么也就看不到了。
而接下来我们要说的是Lambert(兰伯特)材质,这是在灰暗的或者不光滑的表面产生均匀散射而形成的材质类型。比如一张纸就是Lambert表面,它粗糙、均匀。它会在所有的反向上均匀地散射灯光,所以Lambert材质会受到环境光的影响,呈现环境光的颜色,与材质本身颜色关系不大。
而环境光就是在场景中无处不在的光,它对物体的影响是均匀的,也就是说无论你从物体的哪个角度观察,物体的颜色都是一样的,这就是环境光了。
webgl之五彩光源的更多相关文章
- 【WebGL】4.光源
光的类型:所有的光都是从THREE.Light继承,分为环境光THREE.AmbientLight,点光源PointLight,聚光灯THREE.SpotLight和方向光THREE.Directio ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- three.js光源
在Threejs中,光源用Light表示,它是所有光源的基类.它的构造函数是: THREE.Light ( hex ) 它有一个参数hex,接受一个16进制的颜色值.例如要定义一种红色的光源,我们可以 ...
- 结合WebSocket编写WebGL综合场景示例
在WebGL场景中导入多个Babylon骨骼模型,在局域网用WebSocket实现多用户交互控制. 首先是场景截图: 上图在场景中导入一个Babylon骨骼模型,使用asdw.空格.鼠标控制加速度移动 ...
- [WebGL入门]二十四,补色着色
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- WebGL 高级技术
1.如何实现雾化 实现雾化的方式由多种,这里使用最简单的一种:线性雾化(linear fog).在线性雾化中,某一点的雾化程度取决于它与视点之间的距离,距离越远雾化程度越高.线性雾化有起点和终点,起点 ...
- webgl自学笔记——光照
在Webgl中我们使用顶点着色器和片元着色器来为我们的场景创建光照模型.着色器允许我们使用数学模型来控制如何照亮我们的场景. 最好有线性代数的相关知识. 本章中: 光源.法线.材料 光照和着色的区别 ...
- WebGL多模型光照综合实例
原文地址:WebGL多模型光照综合实例 WebGL是一个非常的接近硬件底层的光栅化API, 从非常类似C/C++风格的API调用方式就可以看出来, 习惯了高级语言的我们会觉得很不友好,觉得特别 ...
- WebGL光照阴影映射
原文地址:WebGL光照阴影映射 经过前面的学习,webgl的基本功能都已经掌握了,我们不仅掌握了着色器的编写,图形的绘制,矩阵的变换,添加光照,还通过对webgl的基础api封装,编写出了便 ...
随机推荐
- SQL之GROUP BY 语句
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...
- 动态样式CSS
<link>标签可以把外部css样式引入HTML页面 <style>元素用于指定嵌入的样式 通过修改link的href属性,改变引入的css样式 function loadSt ...
- AngularJS中$interval和$timeout的使用
我们在项目中会出现定时刷新,延迟加载等多种场景. 接下来就看$interval和$timeout的使用 $interval可用于定时任务,我们只需在controller注入$interval即可使用. ...
- UNIX之父肯和丹尼斯(连载二)
从那一场“黑客招聘会”说起 2012年7月末在拉斯维加斯召开的全球黑客大会,已经是这系列会议的第二十一次.除了惯常的Bug发表.技术展示之外,最近几年的黑客大会也开始变得越来越像招聘会.IT业 ...
- XCode中安装cocoapods步骤
Ruby是一种功能强大的面向对象的脚本语言 Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.org/ )源来查找.安装.升级和卸载软件包,非常的便 ...
- 第一次Java实验
模仿JavaAppArguments.java实例,编写一个程序,此程序从命令行接受多个数字,求和之后输出. 1.设计思路:命令行参数都是字符串,必须将其转化成数字才能相加,定义一个数组接收字符串 ...
- 转载:readLine()与read()
版权声明:本文为原博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sinat_31057219/article/details/78742653 参考: readLi ...
- Linux (rz、sz命令行)与本地电脑 命令行上传、下载文件
Linux 与本地电脑直接交互, 命令行上传.下载文件. 一.lrzsz命令行安装: 1.rpm安装:(链接: http://pan.baidu.com/s/1cBuTm2 密码: vijf) rpm ...
- java web开发遇到的常见问题解决办法(汇总贴)
1. maven下载jar包失败,重复 maven --> update project 不管用 解决办法: 1.打开本地仓库所在目录, 通过win文件夹的搜索功能,查找 *.lastUpda ...
- Android-AndroidStudio加载工程方式-gradle文件夹
例如:在其他地方,其他工作人员哪里的OpenGateDemo工程是OK的, 然后Copy到李四的电脑上运行是报错,其实所有的错误都和gradle有关: 第一步,李四电脑运行OpenGateDemo工程 ...