Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!-- saved from url=(0052)http://learningwebgl.com/lessons/lesson11/index.html -->
- <html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Learning WebGL lesson 11</title>
- <script type="text/javascript" src="./Learning WebGL lesson 11_files/glMatrix-0.9.5.min.js"></script>
- <script type="text/javascript" src="./Learning WebGL lesson 11_files/webgl-utils.js"></script>
- <script id="shader-fs" type="x-shader/x-fragment">
- precision mediump float;
- varying vec2 vTextureCoord;
- varying vec3 vLightWeighting;
- uniform sampler2D uSampler;
- varying vec4 vColor; //added
- void main(void) {
- gl_FragColor = vec4(vColor.rgb * vLightWeighting, vColor.a);
- }
- </script>
- <script id="shader-vs" type="x-shader/x-vertex">
- attribute vec3 aVertexPosition;
- attribute vec3 aVertexNormal;
- attribute vec2 aTextureCoord;
- attribute vec4 aVertexColor; //added
- uniform mat4 uMVMatrix;
- uniform mat4 uPMatrix;
- uniform mat3 uNMatrix;
- uniform vec3 uAmbientColor;
- uniform vec3 uLightingDirection;
- uniform vec3 uDirectionalColor;
- uniform bool uUseLighting;
- varying vec2 vTextureCoord;
- varying vec3 vLightWeighting;
- varying vec4 vColor; //added
- void main(void) {
- gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
- vColor = aVertexColor;
- if (!uUseLighting) {
- vLightWeighting = vec3(1.0, 1.0, 1.0);
- } else {
- vec3 transformedNormal = uNMatrix * aVertexNormal;
- float directionalLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);
- vLightWeighting = uAmbientColor + uDirectionalColor * directionalLightWeighting;
- }
- }
- </script>
- <script type="text/javascript">
- var gl;
- function initGL(canvas) {
- try {
- gl = canvas.getContext("experimental-webgl");
- gl.viewportWidth = canvas.width;
- gl.viewportHeight = canvas.height;
- } catch (e) {
- }
- if (!gl) {
- alert("Could not initialise WebGL, sorry :-(");
- }
- }
- function getShader(gl, id) {
- var shaderScript = document.getElementById(id);
- if (!shaderScript) {
- return null;
- }
- var str = "";
- var k = shaderScript.firstChild;
- while (k) {
- if (k.nodeType == 3) {
- str += k.textContent;
- }
- k = k.nextSibling;
- }
- var shader;
- if (shaderScript.type == "x-shader/x-fragment") {
- shader = gl.createShader(gl.FRAGMENT_SHADER);
- } else if (shaderScript.type == "x-shader/x-vertex") {
- shader = gl.createShader(gl.VERTEX_SHADER);
- } else {
- return null;
- }
- gl.shaderSource(shader, str);
- gl.compileShader(shader);
- if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
- alert(gl.getShaderInfoLog(shader));
- return null;
- }
- return shader;
- }
- var shaderProgram;
- function initShaders() {
- var fragmentShader = getShader(gl, "shader-fs");
- var vertexShader = getShader(gl, "shader-vs");
- shaderProgram = gl.createProgram();
- gl.attachShader(shaderProgram, vertexShader);
- gl.attachShader(shaderProgram, fragmentShader);
- gl.linkProgram(shaderProgram);
- if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
- alert("Could not initialise shaders");
- }
- gl.useProgram(shaderProgram);
- shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
- gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
- shaderProgram.vertexNormalAttribute = gl.getAttribLocation(shaderProgram, "aVertexNormal");
- gl.enableVertexAttribArray(shaderProgram.vertexNormalAttribute);
- shaderProgram.vertexColorAttribute = gl.getAttribLocation(shaderProgram, "aVertexColor");
- gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);
- shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");
- shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
- shaderProgram.nMatrixUniform = gl.getUniformLocation(shaderProgram, "uNMatrix");
- shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler");
- shaderProgram.useLightingUniform = gl.getUniformLocation(shaderProgram, "uUseLighting");
- shaderProgram.ambientColorUniform = gl.getUniformLocation(shaderProgram, "uAmbientColor");
- shaderProgram.lightingDirectionUniform = gl.getUniformLocation(shaderProgram, "uLightingDirection");
- shaderProgram.directionalColorUniform = gl.getUniformLocation(shaderProgram, "uDirectionalColor");
- }
- var mvMatrix = mat4.create();
- var mvMatrixStack = [];
- var pMatrix = mat4.create();
- function mvPushMatrix() {
- var copy = mat4.create();
- mat4.set(mvMatrix, copy);
- mvMatrixStack.push(copy);
- }
- function mvPopMatrix() {
- if (mvMatrixStack.length == 0) {
- throw "Invalid popMatrix!";
- }
- mvMatrix = mvMatrixStack.pop();
- }
- function setMatrixUniforms() {
- gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);
- gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);
- var normalMatrix = mat3.create();
- mat4.toInverseMat3(mvMatrix, normalMatrix);
- mat3.transpose(normalMatrix);
- gl.uniformMatrix3fv(shaderProgram.nMatrixUniform, false, normalMatrix);
- }
- function degToRad(degrees) {
- return degrees * Math.PI / 180;
- }
- var mouseDown = false;
- var lastMouseX = null;
- var lastMouseY = null;
- var moonRotationMatrix = mat4.create();
- mat4.identity(moonRotationMatrix);
- function handleMouseDown(event) {
- mouseDown = true;
- lastMouseX = event.clientX;
- lastMouseY = event.clientY;
- }
- function handleMouseUp(event) {
- mouseDown = false;
- }
- function handleMouseMove(event) {
- if (!mouseDown) {
- return;
- }
- var newX = event.clientX;
- var newY = event.clientY;
- var deltaX = newX - lastMouseX
- var newRotationMatrix = mat4.create();
- mat4.identity(newRotationMatrix);
- mat4.rotate(newRotationMatrix, degToRad(deltaX / 10), [0, 1, 0]);
- var deltaY = newY - lastMouseY;
- mat4.rotate(newRotationMatrix, degToRad(deltaY / 10), [1, 0, 0]);
- mat4.multiply(newRotationMatrix, moonRotationMatrix, moonRotationMatrix);
- lastMouseX = newX
- lastMouseY = newY;
- }
- var z=-6.0;
- function handleMouseWheel(event)
- {
- var delta = 0;
- if (!event) /* For IE. */
- event = window.event;
- if (event.wheelDelta) { /* IE/Opera. */
- delta = event.wheelDelta/120;
- } else if (event.detail) { /** Mozilla case. */
- /** In Mozilla, sign of delta is different than in IE.
- * Also, delta is multiple of 3.
- */
- delta = -event.detail/3;
- }
- /** If delta is nonzero, handle it.
- * Basically, delta is now positive if wheel was scrolled up,
- * and negative, if wheel was scrolled down.
- */
- if (delta)
- handleScroll(delta);
- /** Prevent default actions caused by mouse wheel.
- * That might be ugly, but we handle scrolls somehow
- * anyway, so don?t bother here..
- */
- if (event.preventDefault)
- event.preventDefault();
- event.returnValue = false;
- }
- function handleScroll(delta)
- {
- if (delta < 0)
- z=z-0.25;
- else
- z=z+0.25;
- }
- var moonVertexPositionBuffer;
- var moonVertexNormalBuffer;
- var moonVertexTextureCoordBuffer;
- var moonVertexIndexBuffer;
- var moonVertexColourBuffer;
- function initBuffers() {
- var latitudeBands = 30;
- var longitudeBands = 30;
- var radius = 2;
- var vertexPositionData = [];
- var normalData = [];
- var textureCoordData = [];
- for (var latNumber=0; latNumber <= latitudeBands; latNumber++) {
- var theta = latNumber * Math.PI / latitudeBands;
- var sinTheta = Math.sin(theta);
- var cosTheta = Math.cos(theta);
- for (var longNumber=0; longNumber <= longitudeBands; longNumber++) {
- var phi = longNumber * 2 * Math.PI / longitudeBands;
- var sinPhi = Math.sin(phi);
- var cosPhi = Math.cos(phi);
- var x = cosPhi * sinTheta;
- var y = cosTheta;
- var z = sinPhi * sinTheta;
- var u = 1 - (longNumber / longitudeBands);
- var v = 1 - (latNumber / latitudeBands);
- normalData.push(x);
- normalData.push(y);
- normalData.push(z);
- textureCoordData.push(u);
- textureCoordData.push(v);
- vertexPositionData.push(radius * x);
- vertexPositionData.push(radius * y);
- vertexPositionData.push(radius * z);
- }
- }
- var unpackedNormalData = [];
- var unpackedVertexPositionData = [];
- for (var latNumber=0; latNumber < latitudeBands; latNumber++) {
- for (var longNumber=0; longNumber < longitudeBands; longNumber++) {
- var index = latNumber*(longitudeBands+1)+longNumber;
- unpackedVertexPositionData.push(vertexPositionData[index*3]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
- unpackedNormalData.push(normalData[index*3]);
- unpackedNormalData.push(normalData[index*3+1]);
- unpackedNormalData.push(normalData[index*3+2]);
- var index = (latNumber+1)*(longitudeBands+1)+longNumber;
- unpackedVertexPositionData.push(vertexPositionData[index*3]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
- unpackedNormalData.push(normalData[index*3]);
- unpackedNormalData.push(normalData[index*3+1]);
- unpackedNormalData.push(normalData[index*3+2]);
- var index = latNumber*(longitudeBands+1)+longNumber+1;
- unpackedVertexPositionData.push(vertexPositionData[index*3]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
- unpackedNormalData.push(normalData[index*3]);
- unpackedNormalData.push(normalData[index*3+1]);
- unpackedNormalData.push(normalData[index*3+2]);
- var index = (latNumber+1)*(longitudeBands+1)+longNumber+1;
- unpackedVertexPositionData.push(vertexPositionData[index*3]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+1]);
- unpackedVertexPositionData.push(vertexPositionData[index*3+2]);
- unpackedNormalData.push(normalData[index*3]);
- unpackedNormalData.push(normalData[index*3+1]);
- unpackedNormalData.push(normalData[index*3+2]);
- }
- }
- var indexData = [];
- for (var latNumber=0; latNumber < latitudeBands; latNumber++) {
- for (var longNumber=0; longNumber < longitudeBands; longNumber++) {
- var first = (latNumber * longitudeBands + longNumber)*4;
- indexData.push(first);
- indexData.push(first+1);
- indexData.push(first+2);
- indexData.push(first+1);
- indexData.push(first+3);
- indexData.push(first+2);
- }
- }
- moonVertexNormalBuffer = gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexNormalBuffer);
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(unpackedNormalData), gl.STATIC_DRAW);
- moonVertexNormalBuffer.itemSize = 3;
- moonVertexNormalBuffer.numItems = unpackedNormalData.length / 3;
- moonVertexTextureCoordBuffer = gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexTextureCoordBuffer);
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoordData), gl.STATIC_DRAW);
- moonVertexTextureCoordBuffer.itemSize = 2;
- moonVertexTextureCoordBuffer.numItems = textureCoordData.length / 2;
- moonVertexPositionBuffer = gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexPositionBuffer);
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(unpackedVertexPositionData), gl.STATIC_DRAW);
- moonVertexPositionBuffer.itemSize = 3;
- moonVertexPositionBuffer.numItems = unpackedVertexPositionData.length / 3;
- moonVertexIndexBuffer = gl.createBuffer();
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, moonVertexIndexBuffer);
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), gl.STATIC_DRAW);
- moonVertexIndexBuffer.itemSize = 1;
- moonVertexIndexBuffer.numItems = indexData.length;
- var colors = [];
- for (var latNumber=0; latNumber < latitudeBands; latNumber++) {
- for (var longNumber=0; longNumber < longitudeBands*2; longNumber++) {
- r1 = Math.random();
- r2 = Math.random();
- r3 = Math.random();
- colors.push(r1);
- colors.push(r2);
- colors.push(r3);
- colors.push(1.0);
- colors.push(r1);
- colors.push(r2);
- colors.push(r3);
- colors.push(1.0);
- colors.push(r1);
- colors.push(r2);
- colors.push(r3);
- colors.push(1.0);
- colors.push(r1);
- colors.push(r2);
- colors.push(r3);
- colors.push(1.0);
- }
- }
- moonVertexColourBuffer = gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexColourBuffer);
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
- moonVertexColourBuffer.itemSize = 4;
- moonVertexColourBuffer.numItems = colors.length/4;
- }
- function drawScene() {
- gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
- gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
- mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);
- var lighting = document.getElementById("lighting").checked;
- gl.uniform1i(shaderProgram.useLightingUniform, lighting);
- if (lighting) {
- gl.uniform3f(
- shaderProgram.ambientColorUniform,
- parseFloat(document.getElementById("ambientR").value),
- parseFloat(document.getElementById("ambientG").value),
- parseFloat(document.getElementById("ambientB").value)
- );
- var lightingDirection = [
- parseFloat(document.getElementById("lightDirectionX").value),
- parseFloat(document.getElementById("lightDirectionY").value),
- parseFloat(document.getElementById("lightDirectionZ").value)
- ];
- var adjustedLD = vec3.create();
- vec3.normalize(lightingDirection, adjustedLD);
- vec3.scale(adjustedLD, -1);
- gl.uniform3fv(shaderProgram.lightingDirectionUniform, adjustedLD);
- gl.uniform3f(
- shaderProgram.directionalColorUniform,
- parseFloat(document.getElementById("directionalR").value),
- parseFloat(document.getElementById("directionalG").value),
- parseFloat(document.getElementById("directionalB").value)
- );
- }
- mat4.identity(mvMatrix);
- // mat4.translate(mvMatrix, [0, 0, -6]);
- mat4.translate(mvMatrix, [0.0, 0.0, z]);
- mat4.multiply(mvMatrix, moonRotationMatrix);
- gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexPositionBuffer);
- gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, moonVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
- gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexColourBuffer);
- gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, moonVertexColourBuffer.itemSize, gl.FLOAT, false, 0, 0);
- gl.bindBuffer(gl.ARRAY_BUFFER, moonVertexNormalBuffer);
- gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute, moonVertexNormalBuffer.itemSize, gl.FLOAT, false, 0, 0);
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, moonVertexIndexBuffer);
- setMatrixUniforms();
- gl.drawElements(gl.TRIANGLES, moonVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
- }
- function tick() {
- requestAnimFrame(tick);
- drawScene();
- }
- function webGLStart() {
- var canvas = document.getElementById("lesson11-canvas");
- initGL(canvas);
- initShaders();
- initBuffers();
- gl.clearColor(0.0, 0.0, 0.0, 1.0);
- gl.enable(gl.DEPTH_TEST);
- canvas.onmousedown = handleMouseDown;
- document.onmouseup = handleMouseUp;
- document.onmousemove = handleMouseMove;
- canvas.addEventListener('DOMMouseScroll',handleMouseWheel, false);
- canvas.addEventListener('mousewheel',handleMouseWheel, false);
- tick();
- }
- </script>
- </head>
- <body onload="webGLStart();">
- <a href="http://learningwebgl.com/blog/?p=1253"><< Back to Lesson 11</a><br>
- <canvas id="lesson11-canvas" style="border: none;" width="500" height="500"></canvas>
- <br>
- <input type="checkbox" id="lighting" checked=""> Use lighting<br>
- Spin the moon by dragging it with the mouse.
- <br>
- <h2>Directional light:</h2>
- <table style="border: 0; padding: 10px;">
- <tbody><tr>
- <td><b>Direction:</b>
- </td><td>X: <input type="text" id="lightDirectionX" value="-1.0">
- </td><td>Y: <input type="text" id="lightDirectionY" value="-1.0">
- </td><td>Z: <input type="text" id="lightDirectionZ" value="-1.0">
- </td></tr>
- <tr>
- <td><b>Colour:</b>
- </td><td>R: <input type="text" id="directionalR" value="0.8">
- </td><td>G: <input type="text" id="directionalG" value="0.8">
- </td><td>B: <input type="text" id="directionalB" value="0.8">
- </td></tr>
- </tbody></table>
- <h2>Ambient light:</h2>
- <table style="border: 0; padding: 10px;">
- <tbody><tr>
- <td><b>Colour:</b>
- </td><td>R: <input type="text" id="ambientR" value="0.2">
- </td><td>G: <input type="text" id="ambientG" value="0.2">
- </td><td>B: <input type="text" id="ambientB" value="0.2">
- </td></tr>
- </tbody></table>
- <br>
- Moon texture courtesy of <a href="http://maps.jpl.nasa.gov/">the Jet Propulsion Laboratory</a>.
- <br>
- <br>
- <a href="http://learningwebgl.com/blog/?p=1253"><< Back to Lesson 11</a><br>
- <!-- Google Analytics stuff, please ignore - nothing to do with WebGL :-) -->
- <script type="text/javascript">
- var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
- document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
- </script><script src="./Learning WebGL lesson 11_files/ga.js" type="text/javascript"></script>
- <script type="text/javascript">
- try {
- var pageTracker = _gat._getTracker("UA-2240015-5");
- pageTracker._trackPageview();
- } catch(err) {
- }
- </script>
- </body></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement