WebGL渲染目標對象WebGLRenderTarget
實現了WebGL的離屏渲染功能,若是你有必定的WebGL或OpenGL基礎,對幀緩衝區、離線渲染、後處理等概念應該是不陌生的。html
我的WebGL/Three.js技術博客canvas
.render()
方法WebGL渲染器WebGLRenderer渲染方法.render()
的參數( Scene, Camera, WebGLRenderTarget, forceClear )
.app
執行下面代碼會把場景scene的渲染結果保存到canvas畫布對應的默認幀緩衝區中,形象點說就是能夠直接顯示到Cnavas畫布上,顯示器會自動讀取CPU默認幀緩衝區上面的圖像數據顯示。dom
renderer.render(scene, camera);
var renderer = new THREE.WebGLRenderer(); renderer.setSize(width, height); // 渲染結果canvas元素插入到body元素中 document.body.appendChild(renderer.domElement); // .domElement屬性返回的一個canvas畫布對象,保存了render方法的渲染結果 console.log(renderer.domElement);
執行下面代碼WebGL渲染器的渲染結果,也就是一張圖像,不會直接顯示在Canvas畫布上,從Three.js的角度闡述,渲染結果的RGBA像素數據存儲到了WebGL渲染目標對象WebGLRenderTarget
中,經過目標對象的紋理屬性.texture
能夠得到渲染結果的RGBA像素數據,也就是一個Three.js的紋理對象THREE.Texture
,能夠做爲材質對象顏色貼圖屬性map
的屬性值;從原生WebGL的角度闡述,就是渲染結果的RGBA像素值存儲到了GPU一個自定義的幀緩衝區中,屏幕默認不會直接讀取該緩衝區中的像素數據,經過WebGL的特定API能夠獲取,更多的信息能夠百度WebGL或OpenGL離屏渲染。code
// 建立一個WebGL渲染目標對象WebGLRenderTarget // 設置渲染結果(一幀圖像)的像素爲500x500 var target = new THREE.WebGLRenderTarget(500, 500); // 設置特定target的時候,render渲染結果不會顯示在canvas畫布上 renderer.render(scene, camera,target); //執行渲染操做
.texture
經過WebGL渲染目標WebGLRenderTarget
的紋理屬性.texture
能夠得到WebGL渲染器的渲染結果,該屬性返回的結果是一個紋理對象THREE.Texture
,能夠做爲材質Material對象顏色貼圖屬性map
的屬性。orm
var material = new THREE.MeshLambertMaterial({ // WebGL渲染目標對象屬性.texture返回一張紋理貼圖,也就是scene在camera下的渲染結果 map: target.texture, });
這節課主要內容是把WebGL渲染目標對象WebGLRenderTarget
和自定義着色器材質對象ShaderMaterial
結合實現後處理功能。htm
場景Scene對象的渲染結果保存到渲染目標對象target中對象
var target = new THREE.WebGLRenderTarget(500, 500); renderer.render(scene, camera,target);
target.texture
從渲染目標對象target得到渲染結果,而後經過ShaderMaterial
對象把渲染結果傳值給片元着色器中uniform定義的變量texture,而後進行灰度計算後處理。ip
// 自定義頂點着色器對象 var material2 = new THREE.ShaderMaterial({ uniforms: { // texture對應頂點着色器中uniform聲明的texture變量 texture: { // WebGL渲染目標對象屬性.texture返回一張紋理貼圖 value: target.texture }, }, // 頂點着色器 vertexShader: document.getElementById('vertexShader').textContent, // 片元着色器 fragmentShader: document.getElementById('fragmentShader').textContent, });
材質對象material2是場景2中一個網格模型的紋理貼圖,經過render渲染方法把後處理灰度效果顯示出來get
renderer.render(scene2, camera2);
能夠建立多個WebGL渲染目標對象分別保存一個WebGL渲染器的渲染結果,知足一個應用須要在GPU上臨時保存多個後處理效果,而不顯示在Canvas畫布上。
// 建立一個WebGL渲染目標對象target0,像素500X500 var target0 = new THREE.WebGLRenderTarget(500, 500);
// 建立一個WebGL渲染目標對象target1,像素300X500 var target1 = new THREE.WebGLRenderTarget(500, 500);