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);