<img> - 
    još uvijek ostaje najčešći oblik prikaza slikaotvaraju mogućnosti izrade naprednih grafičkih aplikacija bez potrebe dodatnih priključaka
<canvas> oznaka u HTML dokument-> Sada imamo prazan „papir“ za crtanje
    <canvas id="canvas" width="300" height="300"></canvas>
    
  
<canvas> = fiksna površina za crtanje canvas je inicijalno prazan
       var canvas = document.getElementById('canvas');
       var ctx = canvas.getContext('2d');  
       
       
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.fillStyle = "rgb(4,113,196)";
  ctx.fillRect (10, 10, 55, 50);
  ctx.fillStyle = "rgba(196, 4, 4, 0.5)";
  ctx.fillRect (30, 30, 55, 50);  
      fillRect(x,y,width,height) : crta ispunjeni
      strokeRect(x,y,width,height) : crta obrub
      clearRect(x,y,width,height) : obriše područje
    
omogućuje crtanje kompleksnijih oblika
beginPath() : započinje novu stazu lineTo(x, y) : crta ravnu linijumoveTo(x, y) : pomiče početnu točku stazearc(x, y, radius, startAngle, endAngle, anticlockwise) : crta lukove i krugovequadraticCurveTo(cp1x, cp1y, x, y) : kvadratna krivulja bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) : bezierova krivuljarect(x, y, width, height) : dodaje pravokutnu stazu u listu stazaclosePath() : zatvara stazu  stroke() : crta obrub  fill() : crta puni oblik  fillStyle, strokeStyle, lineWidth, lineJoin
         su dio trenutno grafičkog stanja (eng. graphics state)save() i restore() - metode za spremanje i vraćanje canvas stanjasave metoda, gura trenutno stanje na vrh stoga)strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, 
            lineJoin, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, 
            globalCompositeOperation translate(x, y) rotate(angle) scale(x, y) 
      transform(a, b, c, d, e, f) - metoda za direktno modificiranje transformacijske matriceKineticJS je HTML5 Canvas JavaScript biblioteka koja proširuje 2D kontekst omogućujući canvas interaktivnost za desktop i mobilne aplikacije
    
    
    Rezultat je mješavina korisničkih slojeva.
Korisnički slojevi su slojevi koje programeri mogu koristiti kako god hoće. KineticJS aplikacije zahtijevaju barem jedan sloj.
Sloj iza pozornice je skriveni sloj koji koristi prilagođeni canvas kontekst za crtanje nevidljivih oblika radi visokih performansi detekcija staza i izvršavanje rukovatelja događaja oblika.
Sloj spremnika je skriveni sloj koji se koristi za detekciju slikovnih elemenata i canvas kompozicije.
      var stage = new Kinetic.Stage({
        container: "container",
        width: 578,
        height: 200
      });
      var layer = new Kinetic.Layer();
      stage.add(layer);
  
Svi oblici se zadaju na sličan način: instanciranje željenog objekt sa željenim svojstvima (konfiguracija objekta).
     var rect = new Kinetic.Rect({
        x: 20,
        y: 50,
        width: 100,
        height: 50,
        fill: "#00D2FF",
        stroke: "black",
        strokeWidth: 4
     });
     layer.add(rect); // dodaj objekt sloju
   
on() metoda koja veže rukovatelj događaja s objektom oblikamouseover, mouseout, 
   mousemove, mousedown, mouseup, click, dblclick, dragstart, i dragend desktop događaje
     shape.on('click', function(evt){
        // do stuff
      });
   
   
     shape.on('mousedown mouseover', function(evt){
        // do something
      });
   
 detectionType: 'pixel' 
   (svojstvo konfiguracije objekta)saveData() metoduclearData() metodom
      var image = new Kinetic.Image({
        detectionType: 'pixel'
      });
      image.saveData(); // save image data
      image.clearData(); // clear image data
   
 draggable postaviti u true (istinito) kod inicijalizacije objekta
   var shape = new Kinetic.Circle({
    draggable: true;
   });
   shape.draggable(true);
   
transitionTo()metodax,y,rotacija,visina, duljina, 
          radijus, debljina crte, alfa vrijednost, veličina itd.transitionTo()
    metodi mora imati određenu duljinu u sek koja definira koliko dugo prijelaz mora trajati
    shape.transitionTo({
      x: 100,
      duration: 1
    });
   
 linear, ease-in, ease-out, ease-in-out, back-ease-in, back-ease-out, 
    back-ease-in-out, elastic-ease-in, elastic-ease-out, elastic-ease-in-out, bounce-ease-in, 
    bounce-ease-out, bounce-ease-in-out, strong-ease-in, strong-ease-out, i strong-ease-in-out
   
    shape.transitionTo({
      x: 100,
      duration: 1,
      easing: 'bounce-ease-out'
    });
   
    stop() i resume() metodama
   
    trans.stop();    // stop transition
    trans.resume();  // resume transition
   
 start() za inicijalizaciju canvasa
      var canvas;
      var gl;
      
      function start() {
        canvas = document.getElementById("glcanvas");
        initWebGL(canvas); // inicijalizacija GL konteksta
        // nastavlja se samo ako je WebGL dostupan i radi
        if (gl) {
          gl.clearColor(0.0, 0.0, 0.0, 1.0);  // Postavi boju za brisanje
          gl.clearDepth(1.0);                 // Čisti kontekst
          gl.enable(gl.DEPTH_TEST);           // Omogućiti testianje dubine
          gl.depthFunc(gl.LEQUAL);            // Bliže stvari skrivaju dalje
        }
      }
  
    function initWebGL(canvas) { 
      gl = null; 
    
      try {
        gl = canvas.getContext("webgl") 
            || canvas.getContext("experimental-webgl"); 
      }
      catch(e) {}
      if (!gl) { 
        alert("Neuspješnja inicijalizacija WebGL."); 
      } 
    }
  
Crtamo u 3D prostoru -> potrebno je postaviti programe za sjenčanje koji govore WebGL-u gdje treba crtati i što
Inicijalizacija programa za sjenčanje:
    
   
   
    
   
      function initBuffers() {
        // spremnik vrhova
        squareVerticesBuffer = gl.createBuffer();
        
        // vezanje spremnika za kontekst
        gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
        
        var vertices = [
          1.0,  1.0,  0.0,
          -1.0, 1.0,  0.0,
          1.0,  -1.0, 0.0,
          -1.0, -1.0, 0.0
        ];
        
        gl.bufferData(gl.ARRAY_BUFFER, 
            new Float32Array(vertices), gl.STATIC_DRAW);
      }
   
      function drawScene() {
        // brisanje konteksta 
        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
        
        // perspektiva kamere (pogled na scenu)
        // vidno polje od 45° s omjerom širine i visine 640/480
        // crtamo predmete između 0.1 i 100 jedinica
        perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0);
        
        // postavljanje pozicije objekta
        loadIdentity(); // mvMatrix = Matrix.I(4);
        mvTranslate([-0.0, 0.0, -6.0]);
        
        gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
        gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
        setMatrixUniforms();
        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); // crta 0bjekt
      }
   
        var colors = [
          1.0,  1.0,  1.0,  1.0,    // bijela
          1.0,  0.0,  0.0,  1.0,    // crvena
          0.0,  1.0,  0.0,  1.0,    // zelena
          0.0,  0.0,  1.0,  1.0     // plava
        ];
        squareVerticesColorBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer);
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
       
      
          
       
    
    
    
    
  var renderer = new THREE.WebGLRenderer({antialias: true});
  renderer.setSize(document.body.clientWidth,
                  document.body.clientHeight);
  
  document.body.appendChild(renderer.domElement);
// new THREE.PerspectiveCamera( FOV, viewAspectRatio, zNear, zFar ); var camera = new THREE.PerspectiveCamera(45, width/height, 1, 10000); camera.position.z = 300;
  var scene = new THREE.Scene();
  var sphere = new THREE.Mesh(new THREE.SphereGeometry(50, 16, 16),
      new THREE.MeshLambertMaterial({color: 0xCC0000}));
  scene.add(sphere);    
  
  renderer.render(scene, camera);
var light = new THREE.SpotLight(); light.position.set( 10, 50, 130 ); scene.add(light);
// omogućiti sijene za prikaz scene renderer.shadowMapEnabled = true; // omogućiti sjene za svijetlo light.castShadow = true; // omogućiti sjene za objekt sphere.castShadow = true; sphere.receiveShadow = true;
  var projector = new THREE.Projector();
  window.addEventListener('mousedown', function (ev){
    if (ev.target == renderer.domElement) {
      var x = ev.clientX;
      var y = ev.clientY;
      var v = new THREE.Vector3((x/width)*2-1, -(y/height)*2+1, 0.5);
      projector.unprojectVector(v, camera);
      var ray = new THREE.Ray(camera.position, 
                              v.subSelf(camera.position).normalize());
      var intersects = ray.intersectObjects(controller.objects);
      if (intersects.length > 0) {
        controller.setCurrent(intersects[0].object);
      }
    }
  }, false);