Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.50 KB | None | 0 0
  1. <html>
  2.  
  3. <head>
  4. <title>Learning WebGL &mdash; lesson 1</title>
  5. <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  6.  
  7. <script type="text/javascript" src="gl-matrix-min.js"></script>
  8. <script type="text/javascript" src="webgl-utils.js"></script>
  9.  
  10. <style>
  11. body {
  12. margin: 100px;
  13. }
  14. </style>
  15.  
  16. <script id="shader-fs" type="x-shader/x-fragment">
  17. precision mediump float;
  18. varying vec4 vColor;
  19. void main(void) {
  20. gl_FragColor = vColor;
  21. }
  22. </script>
  23.  
  24. <script id="shader-vs" type="x-shader/x-vertex">
  25. attribute vec3 aVertexPosition;
  26. attribute vec4 aVertexColor;
  27.  
  28. uniform mat4 uMVMatrix;
  29. uniform mat4 uPMatrix;
  30.  
  31. varying vec4 vColor;
  32.  
  33. void main(void) {
  34. gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
  35. vColor = aVertexColor;
  36. }
  37. </script>
  38.  
  39. <script type="text/javascript">
  40. let gl;
  41.  
  42. function initGL(canvas) {
  43. try {
  44. gl = canvas.getContext("experimental-webgl");
  45. gl.viewportWidth = canvas.width;
  46. gl.viewportHeight = canvas.height;
  47. } catch (e) {
  48. }
  49. if (!gl) {
  50. alert("Could not initialise WebGL, sorry :-(");
  51. }
  52. }
  53. function getShader(gl, id) {
  54. let shaderScript = document.getElementById(id);
  55. if (!shaderScript) {
  56. return null;
  57. }
  58. let str = "";
  59. let k = shaderScript.firstChild;
  60. while (k) {
  61. if (k.nodeType == 3) {
  62. str += k.textContent;
  63. }
  64. k = k.nextSibling;
  65. }
  66. let shader;
  67. if (shaderScript.type == "x-shader/x-fragment") {
  68. shader = gl.createShader(gl.FRAGMENT_SHADER);
  69. } else if (shaderScript.type == "x-shader/x-vertex") {
  70. shader = gl.createShader(gl.VERTEX_SHADER);
  71. } else {
  72. return null;
  73. }
  74. gl.shaderSource(shader, str);
  75. gl.compileShader(shader);
  76. if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
  77. alert(gl.getShaderInfoLog(shader));
  78. return null;
  79. }
  80. return shader;
  81. }
  82.  
  83. let shaderProgram;
  84.  
  85. function initShaders() {
  86. let fragmentShader = getShader(gl, "shader-fs");
  87.  
  88. let vertexShader = getShader(gl, "shader-vs");
  89.  
  90. shaderProgram = gl.createProgram();
  91. gl.attachShader(shaderProgram, vertexShader);
  92. gl.attachShader(shaderProgram, fragmentShader);
  93. gl.linkProgram(shaderProgram);
  94. if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
  95. alert("Could not initialise shaders");
  96. }
  97. gl.useProgram(shaderProgram);
  98.  
  99. shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
  100. gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
  101.  
  102. shaderProgram.vertexColorAttribute = gl.getAttribLocation(shaderProgram, "aVertexColor");
  103. gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);
  104.  
  105. shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");
  106. shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
  107. }
  108.  
  109. //already defined in webgl-utils.js
  110. // let mvMatrix = mat4.create();
  111. // let pMatrix = mat4.create();
  112.  
  113. function setMatrixUniforms() {
  114. gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);
  115. gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);
  116. }
  117.  
  118. let pyramidVertexPositionBuffer;
  119. let pyramidVertexColorBuffer;
  120.  
  121.  
  122. const numOfElements = 10;
  123.  
  124.  
  125. function Pyramid() {
  126. this.vertices = [
  127. // Front face
  128. 0.0, 1.0, 0.0,
  129. -1.0, -1.0, 1.0,
  130. 1.0, -1.0, 1.0,
  131. // Right face
  132. 0.0, 1.0, 0.0,
  133. 1.0, -1.0, 1.0,
  134. 1.0, -1.0, -1.0,
  135. // Back face
  136. 0.0, 1.0, 0.0,
  137. 1.0, -1.0, -1.0,
  138. -1.0, -1.0, -1.0,
  139. // Left face
  140. 0.0, 1.0, 0.0,
  141. -1.0, -1.0, -1.0,
  142. -1.0, -1.0, 1.0,
  143.  
  144. //floor
  145. 1.0, -1.0, 1.0,
  146. -1.0, -1.0, 1.0,
  147. -1.0, -1.0, -1.0,
  148.  
  149. -1.0, -1.0, -1.0,
  150. 1.0, -1.0, -1.0,
  151. 1.0, -1.0, 1.0
  152. ];
  153.  
  154. this.colors = [
  155. // Front face
  156. 1.0, 0.0, 0.0, 1.0,
  157. 1.0, 0.0, 0.0, 1.0,
  158. 1.0, 0.0, 0.0, 1.0,
  159. // Right face
  160. 0.0, 1.0, 0.0, 1.0,
  161. 0.0, 1.0, 0.0, 1.0,
  162. 0.0, 1.0, 0.0, 1.0,
  163. // Back face
  164. 0.0, 0.0, 1.0, 1.0,
  165. 0.0, 0.0, 1.0, 1.0,
  166. 0.0, 0.0, 1.0, 1.0,
  167. // Left face
  168. 0.0, 0.0, 0.0, 1.0,
  169. 0.0, 0.0, 0.0, 1.0,
  170. 0.0, 0.0, 0.0, 1.0,
  171.  
  172. // Floor
  173. 1.0, 1.0, 1.0, 1.0,
  174. 1.0, 1.0, 1.0, 1.0,
  175. 1.0, 1.0, 1.0, 1.0,
  176. 1.0, 1.0, 1.0, 1.0,
  177. 1.0, 1.0, 1.0, 1.0,
  178. 1.0, 1.0, 1.0, 1.0,
  179. ];
  180. };
  181.  
  182. function initBuffer(gl, elements) {
  183. console.log(gl);
  184. let buffer = gl.createBuffer();
  185. gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
  186. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(elements), gl.STATIC_DRAW);
  187. return buffer;
  188. }
  189.  
  190. Pyramid.prototype.makeBuffers = function(gl) {
  191. this.vertexBuffer = initBuffer(gl, this.vertices);
  192. this.vertexBuffer.itemSize = 3;
  193. this.vertexBuffer.numItems = this.vertices.length / this.vertexBuffer.itemSize;
  194.  
  195. this.colorBuffer = initBuffer(gl, this.colors);
  196. this.colorBuffer.itemSize = 4;
  197. this.colorBuffer.numItems = this.colors.length / this.colorBuffer.itemSize;
  198. }
  199.  
  200. let pyramid = new Pyramid();
  201. pyramid.makeBuffers(gl);
  202.  
  203. var pyramidRotation = -20;
  204.  
  205. function drawScene() {
  206. gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
  207. gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  208.  
  209.  
  210. mat4.perspective(pMatrix, degree2radian(90), gl.viewportWidth / gl.viewportHeight, 0.1, 100.0);
  211.  
  212. mat4.identity(mvMatrix);
  213.  
  214. mat4.translate(mvMatrix, mvMatrix, [0, 0.0, -10.0]);
  215.  
  216. mvPushMatrix();
  217. mat4.rotate(mvMatrix, mvMatrix, degToRad(pyramidRotation), [0, 1, 0]);
  218.  
  219. gl.bindBuffer(gl.ARRAY_BUFFER, pyramid.vertexBuffer);
  220. gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, pyramid.vertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
  221.  
  222. gl.bindBuffer(gl.ARRAY_BUFFER, pyramid.colorBuffer);
  223. gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, pyramid.colorBuffer.itemSize, gl.FLOAT, false, 0, 0);
  224.  
  225. setMatrixUniforms();
  226. gl.drawArrays(gl.TRIANGLES, 0, pyramid.vertexBuffer.numItems);
  227.  
  228. mvPopMatrix();
  229. }
  230.  
  231. var lastTime = 0;
  232. function animate() {
  233. var timeNow = new Date().getTime();
  234. if (lastTime != 0) {
  235. var elapsed = timeNow - lastTime;
  236. pyramidRotation += (90 * elapsed) / 1000.0;
  237. }
  238. lastTime = timeNow;
  239. }
  240.  
  241. function tick() {
  242. drawScene();
  243. // animate();
  244. // requestAnimationFrame(tick);
  245. }
  246.  
  247. function webGLStart() {
  248. let canvas = document.getElementById("lesson01-canvas");
  249. initGL(canvas);
  250. initShaders();
  251. pyramid.makeBuffers(gl);
  252. gl.clearColor(0.7, 0.7, 0.7, 1.0);
  253. gl.enable(gl.DEPTH_TEST);
  254.  
  255. tick();
  256. }
  257.  
  258.  
  259. const degree2radian = degrees => degrees * Math.PI / 180;
  260. </script>
  261.  
  262.  
  263. </head>
  264.  
  265.  
  266. <body onload="webGLStart();">
  267. <canvas id="lesson01-canvas" style="border: none;" width="800" height="800"></canvas>
  268. </body>
  269.  
  270. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement