默认情况下,您在Three.js中渲染的所有内容都会发送到屏幕上。毕竟,如果你看不到它,渲染它有什么意义呢?事实证明,有一个非常重要的点:在数据发送到屏幕(从而丢失)之前捕获数据。
这使得应用后期处理效果(如颜色校正、颜色偏移或模糊)变得更加容易,并且对于着色器效果也很有用。
此技术称为呈现到纹理或呈现到帧缓冲区;最终结果存储在纹理中。然后,您可以将其渲染到屏幕上。在此文章中,我将向您展示如何执行此操作,然后引导您完成将移动立方体渲染到另一个移动立方体表面上的实际示例。
注意:本教程假设你对Three.js有一定的基本了,或者可以访问GLTF编辑器使用了解下three.js的纹理处理功能。
基本实现有很多关于如何做到这一点的例子,这些例子往往嵌入到更复杂的效果中。以下是在Three.js中将某些内容渲染到纹理上所需的最低限度:
//
authorOmarShehata..//WeareloadingtheThree.jslibraryfromtheCDNhere:////Thisisthebasicscenesetup////varscene=newTHREE.Scene();varwidth,height=window.innerWidth,window.innerHeight;varcamera=newTHREE.PerspectiveCamera(70,width/height,1,);varrenderer=newTHREE.WebGLRenderer();renderer.setSize(width,height);document.body.appendChild(renderer.domElement);
////Thisiswherewecreateouroff-screenrendertarget////
//CreateadifferentscenetoholdourbufferobjectsvarbufferScene=newTHREE.Scene();
//CreatethetexturethatwillstoreourresultvarbufferTexture=newTHREE.WebGLRenderTarget(window.innerWidth,window.innerHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter});
//////Addanythingyouwanttorender/captureinbufferScenehere//////
functionrender(){requestAnimationFrame(render);
//Renderontoouroff-screentexturerenderer.render(bufferScene,camera,bufferTexture);//Finally,drawtothescreenrenderer.render(scene,camera);
}render();//Rendereverything!
我们首先是基本的场景设置。然后,我们创建另一个场景;我们添加到此场景的任何对象都将被绘制到屏幕外目标而不是屏幕上。bufferScene
然后我们创建,这是一个WebGLRenderTarget。这就是Three.js用来让我们渲染到屏幕以外的其他东西上的东西。bufferTexture
最后,我们告诉Three.js渲染:bufferScene
renderer.render(bufferScene,camera,bufferTexture);
这就像渲染普通场景一样,只是我们指定了第三个参数:渲染目标。
所以步骤是:
创建一个场景来容纳您的对象。
创建纹理以存储渲染的内容
将场景渲染到纹理上
这基本上是我们需要做的。不过,这并不是很令人兴奋,因为我们什么也看不到。即使您确实向中添加了内容,您仍然不会看到任何内容;这是因为您需要以某种方式将创建的纹理渲染到主场景中。下面是如何执行此操作的示例。bufferScene
示例用法我们将在场景中创建一个立方体,将其绘制到纹理上,然后将其用作新立方体的纹理!
1.从基本场景开始这是我们的基本场景,后面有一个红色的旋转立方体和一个蓝色的平面。这里没有什么特别的事情,但您可以通过切换到演示中的CSS或JS选项卡来查看代码。
你可以在CodePen上分叉和编辑它。
2.将此场景渲染到纹理上现在我们要把它渲染到纹理上。我们需要做的就是创建一个类似于上述基本实现,并将我们的对象添加到其中。bufferScene
你可以在CodePen上分叉和编辑它。
如果做得好,我们将看不到任何东西,因为现在没有任何内容被渲染到屏幕上。相反,我们的场景被渲染并保存在中。bufferTexture
.渲染带纹理的立方体bufferTexture与任何其他纹理没有什么不同。我们可以简单地创建一个新对象并将其用作我们的纹理:
varboxMaterial=newTHREE.MeshBasicMaterial({map:bufferTexture});varboxGeometry2=newTHREE.BoxGeometry(5,5,5);varmainBoxObject=newTHREE.Mesh(boxGeometry2,boxMaterial);
//MoveitbacksowecanseeitmainBoxObject.position.z=-10;
//Addittothemainscenescene.add(mainBoxObject);
你可以在CodePen上分叉和编辑它。
您可以在第一个纹理中绘制任何内容,然后将其渲染到您喜欢的任何纹理上!
潜在用途最直接的用途是任何类型的后期处理效果。如果要对场景应用某种颜色校正或转换,而不是应用于每个对象,则可以将整个场景渲染到一个纹理上,然后在将其渲染到屏幕之前将所需的任何效果应用于最终纹理。
原文链接:three.js纹理(mvrlink.