第三章
環境光:AmbientLight
點光源:PointLight
聚光燈:SpotLight
方向光:DirectionalLight:無限光,例如太陽光,平行光
半球光:HemisphereLight:模拟更加自然的室外光線,反光面,光線微弱的天空
面光源:AreaLight
鏡頭眩光:LensFlare
AmbientLight:影響整個場景的光源
光源沒有特定的來源,不能産生陰影。不能作為場景中唯一光源,言外之意,他是配合其他光源存在的。
作用:弱化陰影或添加一些顔色。
使用該光源,用色應盡量保守。
var ambientColor = '0x0c0c0c';
var ambientLight = new THREE.AmbientLight(ambientColor);
scene.add(ambientLight);
...
var controls = new function(){
this.ambientColor = ambientColor;
}
var gui = new dat.GUI();
gui.addColor(controls,'ambientColor').onchange(function(e){
ambientLight.color = new THREE.Color(e);
});
該光源不需要設定光源的位置,直接添加到Scene中即可。
THREE.Color()對象
函數:
set(value) 設定目前顔色改成指定的十六進制值。這個值可以是字元串或者數字。
setHex(value) 設定目前顔色改成指定的十六進制值。這個值隻能是數字。
setRGB(r,g,b) 參數範圍0-1
setHSV(h,x,v) 參數範圍0-1
copy(colorObj) 從提供的顔色對象指派顔色值到目前對象
getHex()
getHexString()
getHSV()
add(color) 将提供的顔色加到目前的顔色上
addColors(color1,color2)
addScalar(s) 在目前顔色的RGB分量上添加值
clone() 複制目前顔色
PointLig:照射所有方向
點光源不會産生投影,因為他的光線照射所有的方向,計算投影的話對GPU來說是沉重的負擔。
屬性:
color
intensity 光源強度,預設為1
distance 光源照射的距離。預設為0,表示光線的亮度不會随着距離的增加而減少。
position
visible 為true,該光源打開,為false,該光源關閉。
SpotLight:常用的光源,具有錐形效果
可以産生陰影
屬性:
castShadow
shaowCameraNear 從距離光源哪一點開始産生陰影
shadowCameraFar 從距離光源哪一點為止結束生成陰影
shadowCameraFov 用于生成陰影的視場有多大
target 決定光照的方向,一般是一個物體,即光源照向這個物體。
shadowBias 偏移陰影的位置
angle 光源射出的光柱有多寬。預設 Math.PI/3
exponent 光強衰減指數,決定光強遞減的有多快。
onlyShadow 如果為true,則隻産生陰影,不産生光照。
shadowCameraVisible 如果為true,就可以看到光源的位置及如何生成陰影。
shadowDarkness 陰影的陰暗程度,預設為0.5,場景渲染完畢之後不能修改。
shadowMapWidth 決定多少像素渲染陰影,如果陰影邊緣有鋸齒可以增加這個值
shadowMapHeight 決定多少像素渲染陰影,如果陰影邊緣有鋸齒可以增加這個值
target屬性我們可以設定場景中的任何一個物體,目前我們也可以設定空間的任何一點。
var target = new THREE.Object3D();
target.position = new THREE.Vector3(,,);
spotLight.target = target;
DirectionalLight:模拟太陽光
整個區域的光強是一樣的。
可以産生陰影
屬性:
direction
color
intensity
方向光和點光源有很多相同的屬性。
特有屬性:
對于點光源來說,要想産生陰影,我們不得不定義生成引用的光錐。
方向光所有的光線是平行的,是以不會有光錐,取而代之的是一個方塊。
可以使用下面幾個屬性定義一個方塊。
directionalLight.shaowCameraNear = ;
directionalLight.shadowCameraFar = ;
directionalLight.shadowCameraLeft = -;
directionalLight.shadowCameraRight = ;
directionalLight.shadowCameraTop = ;
directionalLight.shadowCameraBottom = -;
HemisphereLight:模拟更加自然的室外光線,反光面,光線微弱的天空
//參數見屬性
var hemiLight = new THREE.HemisphereLight(x0000ff,x00ff00,);
hemiLight.position.set(,,);
scene.add(hemiLight);
屬性:
groundColor:從地面發出的光線的顔色
Color : 從天空發出的光線的顔色
intensity
AreaLight
建立一個矩形的光源。
在Three.js庫的擴充中。
AreaLight是一種複雜的光源,需要使用WebGLDeferredRenderer(WebGL延遲渲染器)
如果我們的場景中有大量的光源,而且性能也有問題,就應該考慮使用 WebGLDeferredRenderer延遲渲染器。
js庫:
WebGLDeferredRenderer.js
ShaderDeferred.js
RenderPass.js
EffectComposer.js
CopyShader.js
ShaderPass.js
FXAAShader.js
MashPass.js
var renderer = new THREE.WebGLDeferredRenderer({
width:window.innerWidth,
height:window.innerHeight,
scale:
antialias:true,
tonemapping:THREE.FilmicOperator,
brightness:
});
第十章會解釋這些參數的含義。
var areaLight = new THREE.AreaLight(,);//光強3
areaLight.position.set(x,y,z);
areaLight.rotation.set(Math.PI/);
areaLight.width = ;
areaLight.height = ;
scene.add(areaLight);
預設情況下,光源是不可見的。
我們可以在光源的地方建立一個平面,來代替光源。
var plane = new THREE.CubeGeometry(,,);
var planeMat = new THREE.MeshBasicMaterial({color:0xff0000});
var plane1 = new THREE.Mesh(plane,planeMat);
plane1.position = areaLight.position;
scene.add(plane1);
LensFlare:鏡頭眩光
var lensFlare = new THREE.LensFlare(texture,size,distance,blending,color);
texture:紋理,決定眩光的樣子
size:決定眩光多大。如果為-1,則使用紋理的大小。
distance:光源(0)到相機的距離(1)
blending:融合,當我們為眩光提供多種材質時,該屬性決定這些材質怎麼融合。預設的融合模式是THREE.AdditiveBlending,它可以提供一種半透明的眩光。
color:顔色
var textureFlare0 = THREE.ImageUtils.loadTexture('../...');
var flareColor = new THREE.Color(xffaacc);
var lensFlare = new THREE.LensFlare(textureFlare0,,,THREE.AdditiveBlending,flareColor);
lensFlare.position = spotLight.position;
scene.add(lensFlare);
進一步美化場景:
var textureFlare3 = THREE.ImageUtils.loadTexture('../...');
lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);