Materials are like clothes for the objects. You can add color, texture and wrap your meshes with it. You can use the same material to cover many meshes. Meshes can be the scene which we just saw in the example in the previous for chapter - the plane passing through the sky.
In this chapter, we will learn how to add color, texture, reflection for the meshes in this chapter.
We will add material to the already created scene. We will progress by adding material to all the shapes we created.
Let us consider a few examples to see how the addition of material works.
var materialforshapes = new BABYLON.StandardMaterial("texture1", scene);
The above material will not change anything since it is the default one. We will use the available properties to make the objects look more appealing.
The available properties are as follows −
Take a look how these properties applied on the material changes the look and feel of the mesh.
Fresnel is the new thing added by BabylonJS on standardmaterial. It allows to change the color applied on the shapes. You can get glass like reflection by using the simple Fresnel. The Fresnel will let you have more reflection on edges and not all on the center.
StandardMaterial.diffuseFresnelParameters StandardMaterial.opacityFresnelParameters StandardMaterial.reflectionFresnelParameters StandardMaterial.emissiveFresnelParameters StandardMaterial.refractionFresnelParameters
<!doctype html> <html> <head> <meta charset = "utf-8"> <title>BabylonJs - Basic Element-Creating Scene</title> <script src = "babylon.js"></script> <style> canvas {width: 100%; height: 100%;} </style> </head> <body> <canvas id = "renderCanvas"></canvas> <script type = "text/javascript"> var canvas = document.getElementById("renderCanvas"); var engine = new BABYLON.Engine(canvas, true); var createScene = function() { var scene = new BABYLON.Scene(engine); var camera = new BABYLON.ArcRotateCamera("camera1", 0, 0, 10, BABYLON.Vector3.Zero(), scene); camera.setPosition(new BABYLON.Vector3(0, 5, -10)); camera.attachControl(canvas); camera.upperBetaLimit = Math.PI / 2; camera.lowerRadiusLimit = 4; var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), scene); light.intensity = 0.7; var knot = BABYLON.Mesh.CreateTorusKnot("knot", 1, 0.4, 128, 64, 2, 3, scene); var yellowSphere = BABYLON.Mesh.CreateSphere("yellowSphere", 16, 1.5, scene); yellowSphere.setPivotMatrix(BABYLON.Matrix.Translation(3, 0, 0)); var yellowMaterial = new BABYLON.StandardMaterial("yellowMaterial", scene); yellowMaterial.diffuseColor = BABYLON.Color3.Yellow(); yellowSphere.material = yellowMaterial; // Ground var ground = BABYLON.Mesh.CreateBox("Mirror", 1.0, scene); ground.scaling = new BABYLON.Vector3(100.0, 0.01, 100.0); ground.material = new BABYLON.StandardMaterial("ground", scene); ground.material.diffuseTexture = new BABYLON.Texture("images/rainbow.png", scene); ground.material.diffuseTexture.uScale = 10; ground.material.diffuseTexture.vScale = 10; ground.position = new BABYLON.Vector3(0, -2, 0); // Main material var mainMaterial = new BABYLON.StandardMaterial("main", scene); knot.material = mainMaterial; var probe = new BABYLON.ReflectionProbe("main", 512, scene); probe.renderList.push(yellowSphere); probe.renderList.push(ground); mainMaterial.diffuseColor = new BABYLON.Color3(1, 0.5, 0.5); mainMaterial.refractionTexture = probe.cubeTexture; mainMaterial.refractionFresnel<h3>Parameters</h3> = new BABYLON.Fresnel<h3>Parameters</h3>(); mainMaterial.refractionFresnel<h3>Parameters</h3>.bias = 0.5; mainMaterial.refractionFresnel<h3>Parameters</h3>.power = 16; mainMaterial.refractionFresnel<h3>Parameters</h3>.leftColor = BABYLON.Color3.Black(); mainMaterial.refractionFresnel<h3>Parameters</h3>.rightColor = BABYLON.Color3.White(); mainMaterial.indexOfRefraction = 1.05; // Fog scene.fogMode = BABYLON.Scene.FOGMODE_LINEAR; scene.fogColor = scene.clearColor; scene.fogStart = 20.0; scene.fogEnd = 50.0; // Animations scene.registerBeforeRender(function () { yellowSphere.rotation.y += 0.01; // greenSphere.rotation.y += 0.01; }); return scene; }; var scene = createScene(); engine.runRenderLoop(function() { scene.render(); }); </script> </body> </html>
The above line of code generates the following output −
Following code applies the Fresnel effect. The colors left and right are applied to the edges of the meshes.
mainMaterial.refractionFresnelParameters = new BABYLON.FresnelParameters(); mainMaterial.refractionFresnelParameters.bias = 0.5; mainMaterial.refractionFresnelParameters.power = 16; mainMaterial.refractionFresnelParameters.leftColor = BABYLON.Color3.Black(); mainMaterial.refractionFresnelParameters.rightColor = BABYLON.Color3.White();
Bias and power property control the Fresnel effect on the surface.
In this demo, we have used an image called rainbow.png. The images are stored in images/ folder locally. You can download any image of your choice and use in the demo link.