Three.js WebGLRenderTarget(离屏渲染)

WebGLRenderTarget(离屏渲染)

WebGL渲染目标对象WebGLRenderTarget实现了WebGL的离屏渲染功能,如果你有一定的WebGL或OpenGL基础,对帧缓冲区、离线渲染、后处理等概念应该是不陌生的。

.render()方法

WebGL渲染器WebGLRenderer渲染方法.render()的参数( Scene, Camera, WebGLRenderTarget, forceClear ).

  • Scene:要渲染的场景对象
  • Camera:场景对象对应的相机对象
  • WebGLRenderTarget:如果参数指定了WebGL渲染目标WebGLRenderTarget,渲染的图像结果保存到该对象,或者说保存到GPU自定义帧缓冲区中,不会显示到canvas画布上; 如果没有指定渲染目标,也就是没有该参数,渲染结果会直接显示到canvas画布上,或者说渲染结果保存到canvas画布对应的默认帧缓冲区中.
无渲染目标(Canvas显示)

执行下面代码会把场景scene的渲染结果保存到canvas画布对应的默认帧缓冲区中,形象点说就是可以直接显示到Cnavas画布上,显示器会自动读取CPU默认帧缓冲区上面的图像数据显示。

  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);
有渲染目标(Canvas不显示)

执行下面代码WebGL渲染器的渲染结果,也就是一张图像,不会直接显示在Canvas画布上,从Three.js的角度阐述,渲染结果的RGBA像素数据存储到了WebGL渲染目标对象WebGLRenderTarget中,通过目标对象的纹理属性.texture可以获得渲染结果的RGBA像素数据,也就是一个Three.js的纹理对象THREE.Texture,可以作为材质对象颜色贴图属性map的属性值;从原生WebGL的角度阐述,就是渲染结果的RGBA像素值存储到了GPU一个自定义的帧缓冲区中,屏幕默认不会直接读取该缓冲区中的像素数据,通过WebGL的特定API可以获取,更多的信息可以百度WebGL或OpenGL离屏渲染。

// 创建一个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的属性。

var material = new THREE.MeshLambertMaterial({
  // WebGL渲染目标对象属性.texture返回一张纹理贴图,也就是scene在camera下的渲染结果
  map: target.texture,
});
WebGLRenderTarget实现灰度图后处理功能

这节课主要内容是把WebGL渲染目标对象WebGLRenderTarget和自定义着色器材质对象ShaderMaterial结合实现后处理功能。

灰度计算后处理

场景Scene对象的渲染结果保存到渲染目标对象target中


var target = new THREE.WebGLRenderTarget(500, 500);
renderer.render(scene, camera,target);

target.texture从渲染目标对象target获得渲染结果,然后通过ShaderMaterial对象把渲染结果传值给片元着色器中uniform定义的变量texture,然后进行灰度计算后处理。

// 自定义顶点着色器对象
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渲染方法把后处理灰度效果显示出来

renderer.render(scene2, camera2);

创建多个WebGL渲染目标对象
可以创建多个WebGL渲染目标对象分别保存一个WebGL渲染器的渲染结果,满足一个应用需要在GPU上临时保存多个后处理效果,而不显示在Canvas画布上。

// 创建一个WebGL渲染目标对象target0,像素500X500
var target0 = new THREE.WebGLRenderTarget(500, 500);
// 创建一个WebGL渲染目标对象target1,像素300X500
var target1 = new THREE.WebGLRenderTarget(500, 500);

原文链接:https://blog.csdn.net/u014291990/article/details/92652251

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在three.js中实现水面倒影效果,可以使用three.js渲染目标(RenderTarget)和镜面反射(Mirror)材质。 首先,需要创建一个渲染目标对象,用于渲染水面的倒影。这个渲染目标对象需要和场景中的相机和水面的位置对应。可以使用Three.jsWebGLRenderTarget类来创建一个渲染目标对象。 接下来,将水面的材质设置为镜面反射材质(MirrorMaterial)。这个材质需要一个反射贴图,可以使用上一步创建的渲染目标对象作为反射贴图。 最后,在渲染场景时,需要先渲染渲染目标对象,再将渲染目标对象作为反射贴图应用到水面的材质上。 代码示例: ``` // 创建渲染目标对象 var mirrorRenderTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight ); // 创建水面对象 var waterGeometry = new THREE.PlaneGeometry(1000, 1000); var waterMaterial = new THREE.MirrorMaterial({ color: 0x777777, envMap: mirrorRenderTarget.texture }); var water = new THREE.Mesh(waterGeometry, waterMaterial); water.rotation.x = -Math.PI / 2; scene.add(water); // 渲染场景到渲染目标对象 renderer.render(scene, mirrorCamera, mirrorRenderTarget); // 将渲染目标对象作为反射贴图应用到水面的材质上 waterMaterial.envMap = mirrorRenderTarget.texture; ``` 需要注意的是,这个方法只能实现静态的倒影效果,如果场景中有动态的物体,需要在每一帧重新渲染倒影。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值