Top Banner
WebGL para JavaScripters Luz Caballero
42

Webgl para JavaScripters

Oct 18, 2014

Download

Technology

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Webgl para JavaScripters

WebGL para JavaScripters

Luz Caballero

Page 2: Webgl para JavaScripters

Web Opener

Luz Caballero - @gerbille

Page 3: Webgl para JavaScripters

Agenda

• Que es WebGL?

• Para qué se puede usar?

• Cómo funciona?

• Lo que hay que saber para empezar

• Un poco de código

Page 5: Webgl para JavaScripters

OpenGL OpenGL ES WebGL

Page 6: Webgl para JavaScripters

desktop mobile

Page 7: Webgl para JavaScripters

<canvas id=‘c’ width=‘100’ height=‘100’></canvas>

document.getElementById(‘c’).getContext(‘webgl’)

Page 8: Webgl para JavaScripters

Para qué se puede usar?

Page 9: Webgl para JavaScripters

• Visualización de datos

• Creative coding

• Arte

• Environments de diseño 3D

• Videos de música

• Graficación de funciones matemáticas

• Modelado de objectos y espacios 3D

• Creación de texturas

• Simulaciones físicas

• ...procesamiento rápido de cualquier tipo de datos

Page 18: Webgl para JavaScripters

creación de texturas

Page 20: Webgl para JavaScripters

Cómo funciona?

Page 21: Webgl para JavaScripters
Page 22: Webgl para JavaScripters

JavaScript

GPU (Compiled Program)

WebGL JS API

Page 23: Webgl para JavaScripters

JavaScript

Fragment Shader

WebGL JS API

Vertex ShaderGLSL API

GLSL API

Page 24: Webgl para JavaScripters

Lo que hay que saber para empezar

Page 25: Webgl para JavaScripters

image source: http://computer.yourdictionary.com/graphics

The 3D scene

Page 27: Webgl para JavaScripters

desktop mobile

Page 29: Webgl para JavaScripters

Un poco de código

Page 31: Webgl para JavaScripters

<!DOCTYPE html><html>  <head>    <title>Learning WebGL lesson 11 in PhiloGL</title>    <link href="path/to/file.css" type="text/css" rel="stylesheet" media="screen" />    <script src="path/to/PhiloGL.js"></script>    <script src="path/to/index.js"></script>  </head>          <body onload="webGLStart();">    <canvas id="lesson11-canvas" width="500" height="500"></canvas>    <!-- more html elements here... -->  </body></html>

Page 32: Webgl para JavaScripters

function webGLStart() {  var pos, $ = function(d) { return document.getElementById(d); };      //Create moon   var moon = new PhiloGL.O3D.Sphere({    nlat: 30,    nlong: 30,    radius: 2,    textures: 'moon.gif'  });

Page 33: Webgl para JavaScripters

  //Create application  PhiloGL('lesson11-canvas', {    camera: {      position: {        x: 0, y: 0, z: -7      }    },    textures: {      src: ['moon.gif'],      parameters: [{        name: 'TEXTURE_MAG_FILTER',        value: 'LINEAR'      }, {        name: 'TEXTURE_MIN_FILTER',        value: 'LINEAR_MIPMAP_NEAREST',        generateMipmap: true      }]    },    events: {      onDragStart: function(e) {        pos = {          x: e.x,          y: e.y        };      },      onDragMove: function(e) {        var z = this.camera.position.z,        sign = Math.abs(z) / z;

        moon.rotation.y += -(pos.x - e.x) / 100;        moon.rotation.x += sign * (pos.y - e.y) / 100;        moon.update();        pos.x = e.x;        pos.y = e.y;      },      onMouseWheel: function(e) {        e.stop();        var camera = this.camera;        camera.position.z += e.wheel;        camera.update();      }    },

Page 34: Webgl para JavaScripters

    onError: function() {      alert("There was an error creating the app.");    },    onLoad: function(app) {      //Unpack app properties      var gl = app.gl,      program = app.program,      scene = app.scene,      canvas = app.canvas,      camera = app.camera;

      //get light config from forms    lighting = $('lighting'),    ambient = {      r: $('ambientR'),      g: $('ambientG'),      b: $('ambientB')    },    direction = {      x: $('lightDirectionX'),      y: $('lightDirectionY'),      z: $('lightDirectionZ'),

      r: $('directionalR'),      g: $('directionalG'),      b: $('directionalB')    };    //Basic gl setup    gl.clearColor(0.0, 0.0, 0.0, 1.0);    gl.clearDepth(1.0);    gl.enable(gl.DEPTH_TEST);    gl.depthFunc(gl.LEQUAL);    gl.viewport(0, 0, canvas.width, canvas.height);

Page 35: Webgl para JavaScripters

//Add object to the scene    scene.add(moon);        //Draw the scene    draw();        

    function draw() {      //clear the screen      gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);      //Setup lighting      var lights = scene.config.lights;      lights.enable = lighting.checked;      lights.ambient = {        r: +ambient.r.value,        g: +ambient.g.value,        b: +ambient.b.value      };      lights.directional = {        color: {          r: +direction.r.value,          g: +direction.g.value,          b: +direction.b.value        },        direction: {          x: +direction.x.value,          y: +direction.y.value,          z: +direction.z.value        }      };        //render moon      scene.render();      //Animate      Fx.requestAnimationFrame(draw);      }    }  });}

Page 37: Webgl para JavaScripters

<script>    if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

var SCREEN_WIDTH = window.innerWidth;var SCREEN_HEIGHT = window.innerHeight;var FLOOR = 0;

var container;

var camera, scene;var webglRenderer;

var zmesh, geometry;

var mouseX = 0, mouseY = 0;

var windowHalfX = window.innerWidth / 2;var windowHalfY = window.innerHeight / 2;

document.addEventListener( 'mousemove', onDocumentMouseMove, false );init();animate();

Page 38: Webgl para JavaScripters

function init() {  container = document.createElement( 'div' );  document.body.appendChild( container );              // camera  camera = new THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000 );  camera.position.z = 75;              // scene  scene = new THREE.Scene();

  // lights  var ambient = new THREE.AmbientLight( 0xffffff );  scene.add( ambient );              // more lights  var directionalLight = new THREE.DirectionalLight( 0xffeedd );  directionalLight.position.set( 0, -70, 100 ).normalize();  scene.add( directionalLight );}

Page 39: Webgl para JavaScripters

// rendererwebglRenderer = new THREE.WebGLRenderer();webglRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );webglRenderer.domElement.style.position = "relative";container.appendChild( webglRenderer.domElement );

// loadervar loader = new THREE.JSONLoader(),loader.load( { model: "obj/church/church.js", callback: createScene } );                                         function createScene( geometry ) {  zmesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() );  zmesh.position.set( 0, 16, 0 );  zmesh.scale.set( 1, 1, 1 );  scene.add( zmesh );}

function onDocumentMouseMove(event) {  mouseX = ( event.clientX - windowHalfX );  mouseY = ( event.clientY - windowHalfY );}

Page 40: Webgl para JavaScripters

function animate() {  requestAnimationFrame( animate );  render();}

function render() {  zmesh.rotation.set(-mouseY/500 + 1, -mouseX/200, 0);  webglRenderer.render( scene, camera );}</script>                                         

Page 41: Webgl para JavaScripters

Resources• An Introduction to WebGL @ dev.Opera

• PhiloGL

• PhiloGL tutorial

• WebGL w/o a library @ dev.Opera

• Porting 3D models to WebGL @ dev.Opera

• News and resources @ the Learning WebGL blog

• WebGL w/o a library @ Learning WebGL

• Three.js

• Three.js tutorial

• WebGL FAQ

• The Khronos WebGL forum

• WebGL-dev mailing list

Page 42: Webgl para JavaScripters

Thanks!

@gerbille