Snabbtips Hur man ger en textur i Three.js

Som standard skickas allt du gör i Three.js till skärmen. När allt är meningen med att göra något om du inte kan se det? Det visar sig vara en mycket viktig punkt: fånga data innan den skickas till skärmen (och därmed förlorad). 

Det gör det mycket lättare att tillämpa efterbehandlingseffekter, till exempel färgkorrigering, färgskiftning eller suddning, och det är användbart även för skuggningseffekter..

Denna teknik är känd som återgivning till en konsistens eller återgivning till en rambuffert; Ditt slutresultat är lagrat i en textur. som du då kan göra till skärmen. I denna snabba tips visar jag dig hur man gör det och går sedan igenom ett praktiskt exempel på att göra en rörlig kub på ytorna på en annan rörlig kub.

Notera: Denna handledning förutsätter att du har grundläggande kunskap om Three.js. Om inte, kolla Hur läser Three.js för spelutveckling.

Grundläggande genomförande

Det finns många exempel där ute om hur man gör det som tenderar att vara inbäddade i mer komplicerade effekter. Här är det minsta minimumet du behöver för att göra något på en textur i Three.js:

// @author Omar Shehata. 2016. // Vi laddar biblioteket Three.js från CDN här: // http://cdnjs.com/libraries/three.js/ //// Det här är den grundläggande scenuppsättningen //// var scene = nya THREE.Scene (); var bredd, höjd = window.innerWidth, window.innerHeight; var kamera = ny THREE.PerspectiveCamera (70, bredd / höjd, 1, 1000); var renderer = nytt THREE.WebGLRenderer (); renderer.setSize (bredd, höjd); document.body.appendChild (renderer.domElement); //// Det är här vi skapar vårt mål för offscreen render //// // Skapa en annan scen för att hålla våra buffertobjekt var bufferScene = new THREE.Scene (); // Skapa texturen som lagrar vårt resultat var bufferTexture = nytt THREE.WebGLRenderTarget (window.innerWidth, window.innerHeight, minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter); //// // Lägg till vad du vill göra / fånga i bufferScene här // //// function render () requestAnimationFrame (render); // Återvänd till vår off-screen textur renderer.render (bufferScene, kamera, bufferTexture); // Slutligen dra till skärmen renderer.render (scen, kamera);  render (); // Återbetala allt!

Vi har först grundinställningen. Då skapar vi en annan scen, bufferScene; Alla objekt som vi lägger till i den här scenen kommer att dras till vårt skärmmål i stället för till skärmen.

Vi skapar då bufferTexture, vilket är en WebGLRenderTarget. Så här använder Three.js för att låta oss göra på något annat än skärmen. 

Slutligen berättar vi att Three.js ska göra bufferScene:

renderer.render (bufferScene, kamera, bufferttextur);

Det här är precis som att göra en normal scen, förutom att vi anger ett tredje argument: render-målet. 

Så stegen är:

  1. Skapa en scen för att hålla dina objekt.
  2. Skapa en textur för att lagra det du gör
  3. Rendera din scen på din textur

Detta är i huvudsak vad vi behöver göra. Det är dock inte så spännande, eftersom vi inte kan se någonting. Även om du lägger till saker i bufferScene, du kommer fortfarande inte se någonting; Detta beror på att du på något sätt måste göra den textur du skapade på din huvudplats. Följande är ett exempel på hur du gör det.

Exempel Användning

Vi ska skapa en kub i en scen, dra den på en konsistens och använd sedan den där som en textur för en ny kub!

1. Börja med en grundläggande scen

Här är vår grundläggande scen med en röd roterande kub och ett blått plan bakom det. Det finns inget speciellt på gång här, men du kan kolla in koden genom att växla till CSS eller JS flikar i demo.

Du kan gaffla och redigera detta på CodePen.

2. Rendera denna scen på en textur

Nu ska vi ta det och göra det på en konsistens. Allt vi behöver göra är att skapa en bufferScene precis som i ovanstående grundläggande implementering, och lägg till våra objekt till den.

Du kan gaffla och redigera detta på CodePen.

Om det görs rätt så kommer vi inte se någonting, eftersom nu ingenting görs på skärmen. I stället görs vår scen och sparas i bufferTexture.

3. Rendera en texturerad kub

bufferTexture skiljer sig inte från någon annan textur. Vi kan helt enkelt skapa ett nytt objekt och använda det som vår textur:

var boxMaterial = nytt THREE.MeshBasicMaterial (map: bufferTexture); var boxGeometry2 = ny THREE.BoxGeometry (5, 5, 5); var mainBoxObject = nytt THREE.Mesh (boxGeometry2, boxMaterial); // Flytta tillbaka det så att vi kan se det mainBoxObject.position.z = -10; // Lägg till den till huvudscenen scene.add (mainBoxObject);
Du kan gaffla och redigera detta på CodePen.

Du kan eventuellt dra något i den första konsistensen och sedan göra det på vad du vill! 

Potentiella användningsområden

Den mest enkla användningen är någon form av efterbehandlingseffekt. Om du ville tillämpa någon form av färgkorrigering eller skifta till din scen, istället för att applicera på varje enskilt objekt, kan du bara göra hela din scen på en konsistens och sedan applicera vilken effekt du vill ha den slutliga texturen innan du gör det till skärmen. 

Vilken typ av skuggare som kräver flera passeringar (såsom oskärpa) kommer att utnyttja denna teknik. Jag förklarar hur man använder rambuffertar för att skapa en rökeffekt i denna handledning.

Förhoppningsvis har du hittat det här lilla tipset användbart! Om du upptäcker några fel eller har några frågor, vänligen meddela mig det i kommentarerna!