返回顶部
首页 > 资讯 > 前端开发 > VUE >如何在HTML5的浏览器上运行WebGL程序
  • 547
分享到

如何在HTML5的浏览器上运行WebGL程序

2024-04-02 19:04:59 547人浏览 安东尼
摘要

本篇内容主要讲解“如何在HTML5的浏览器上运行webGL程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在html5的浏览器上运行WEBGL程序”吧!&

本篇内容主要讲解“如何在HTML5的浏览器上运行webGL程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在html5的浏览器上运行WEBGL程序”吧!

 前提条件和预期结果

目前只有少数的浏览器支持 WebGL ,请看我的另外一篇文章:Can I use WebGL?.

下面的例子是在 windows 下的 Chrome 16/23 以及 Android 下的 Firefox 17 进行测试。如果你使用的是非兼容浏览器访问则会弹出一个警告。 
如何在HTML5的浏览器上运行WebGL程序

 图1:包含 Hello world 文本的动画的 WebGL 立方体
在兼容 HTML5 的浏览器上,你将会看到如下图所示的带动画效果的立方体:
如何在HTML5的浏览器上运行WebGL程序

 图2: 示例运行的屏幕截图


该代码基于 Lighting in WebGL - How to simulate lighting effects in your WebGL context - 非常感谢这篇教程。在该实例初始运行时,动画的立方体是通过一个静态的 Bitmap 图形对象渲染的。

下面的代码演示如何在程序中动态的渲染文本:

XML/HTML Code复制内容到剪贴板

  1. // TODO #1 New method to create a texture   

  2. function createCubeTexture(text) {   

  3.     ...   

  4. }  

在这里使用 gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); 是非常重要的,用来确保写文本时不会前后颠倒。剩下的就很容易理解了:

XML/HTML Code复制内容到剪贴板

  1. // TODO #2 Assign the created texture for display   

  2. cubeTexture = createCubeTexture("Hello World!");  

源码

// File #1: webgl-demo.htm

XML/HTML Code复制内容到剪贴板

  1. <html>  

  2.   <head>  

  3.     <title>WebGL - Hello World!</title>  

  4.     <meta Http-equiv="Content-Type" content="text/html; charset=utf-8">  

  5.     <script src="sylvester.js" type="text/javascript"></script>  

  6.     <script src="glUtils.js" type="text/javascript"></script>  

  7.     <script src="webgl-demo.js" type="text/javascript"></script>  

  8.         

  9.     <!-- Fragment shader program -->  

  10.     <script id="shader-fs" type="x-shader/x-fragment">  

  11.       varying highp vec2 vTextureCoord;   

  12.       varying highp vec3 vLighting;   

  13.           

  14.       unifORM sampler2D uSampler;   

  15.           

  16.       void main(void) {   

  17.         highp vec4 texelColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));   

  18.             

  19.         gl_FraGColor = vec4(texelColor.rgb * vLighting, texelColor.a);   

  20.       }   

  21.     </script>  

  22.         

  23.     <!-- Vertex shader program -->  

  24.     <script id="shader-vs" type="x-shader/x-vertex">  

  25.       attribute highp vec3 aVertexNormal;   

  26.       attribute highp vec3 aVertexPosition;   

  27.       attribute highp vec2 aTextureCoord;   

  28.         

  29.       uniform highp mat4 uNormalMatrix;   

  30.       uniform highp mat4 uMVMatrix;   

  31.       uniform highp mat4 uPMatrix;   

  32.           

  33.       varying highp vec2 vTextureCoord;   

  34.       varying highp vec3 vLighting;   

  35.         

  36.       void main(void) {   

  37.         gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);   

  38.         vTextureCoord = aTextureCoord;   

  39.             

  40.         // Apply lighting effect   

  41.             

  42.         highp vec3 ambientLight = vec3(0.6, 0.6, 0.6);   

  43.         highp vec3 directionalLightColor = vec3(0.5, 0.5, 0.75);   

  44.         highp vec3 directionalVector = vec3(0.85, 0.8, 0.75);   

  45.         highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0);   

  46.        

  47.         highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0);   

  48.         vLighting = ambientLight + (directionalLightColor * directional);   

  49.       }   

  50.     </script>  

  51.   </head>        

  52.       

  53.   <body onload="start()">  

  54.     <canvas id="glcanvas" width="640" height="480">  

  55.       Your browser doesn't appear to support the HTML5 <code><canvas></code> element.   

  56.     </canvas>  

  57.   </body>  

  58. </html>  

// File #02: webgl-demo.js

XML/HTML Code复制内容到剪贴板

  1. var canvas;   

  2. var gl;   

  3.     

  4. var cubeVerticesBuffer;   

  5. var cubeVerticesTextureCoordBuffer;   

  6. var cubeVerticesIndexBuffer;   

  7. var cubeVerticesIndexBuffer;   

  8. var cubeRotation = 0.0;   

  9. var lastCubeUpdateTime = 0;   

  10.     

  11. var cubeImage;   

  12. var cubeTexture;   

  13.     

  14. var mvMatrix;   

  15. var shaderProgram;   

  16. var vertexPositionAttribute;   

  17. var vertexNormalAttribute;   

  18. var textureCoordAttribute;   

  19. var perspectiveMatrix;   

  20.     

  21. //   

  22. // start   

  23. //   

  24. // Called when the canvas is created to get the ball rolling.   

  25. //   

  26. function start() {   

  27.   canvas = document.getElementById("glcanvas");   

  28.     

  29.   initWebGL(canvas);      // Initialize the GL context   

  30.       

  31.   // Only continue if WebGL is available and working   

  32.       

  33.   if (gl) {   

  34.     gl.clearColor(0.0, 0.0, 0.0, 1.0);  // Clear to black, fully opaque   

  35.     gl.clearDepth(1.0);                 // Clear everything   

  36.     gl.enable(gl.DEPTH_TEST);           // Enable depth testing   

  37.     gl.depthFunc(gl.LEQUAL);            // Near things obscure far things   

  38.         

  39.     // Initialize the shaders; this is where all the lighting for the   

  40.     // vertices and so forth is established.   

  41.         

  42.     initShaders();   

  43.         

  44.     // Here's where we call the routine that builds all the objects   

  45.     // we'll be drawing.   

  46.         

  47.     initBuffers();   

  48.         

  49.     // Next, load and set up the textures we'll be using.   

  50.         

  51.     // TODO#2 Start   

  52.     cubeTexture = createCubeTexture("Hello World!");   

  53.     // TODO#2 End   

  54.         

  55.     // Set up to draw the scene periodically.   

  56.         

  57.     setInterval(drawScene, 15);   

  58.   }   

  59. }   

  60.     

  61. //   

  62. // initWebGL   

  63. //   

  64. // Initialize WebGL, returning the GL context or null if   

  65. // WebGL isn't available or could not be initialized.   

  66. //   

  67. function initWebGL() {   

  68.   gl = null;   

  69.       

  70.   try {   

  71.     gl = canvas.getContext("experimental-webgl");   

  72.   }   

  73.   catch(e) {   

  74.   }   

  75.       

  76.   // If we don't have a GL context, give up now   

  77.       

  78.   if (!gl) {   

  79.     alert("Unable to initialize WebGL. Your browser may not support it.");   

  80.   }   

  81. }   

  82.     

  83. //   

  84. // initBuffers   

  85. //   

  86. // Initialize the buffers we'll need. For this demo, we just have   

  87. // one object -- a simple two-dimensional cube.   

  88. //   

  89. function initBuffers() {   

  90.       

  91.   // Create a buffer for the cube's vertices.   

  92.       

  93.   cubeVerticesBuffer = gl.createBuffer();   

  94.       

  95.   // Select the cubeVerticesBuffer as the one to apply vertex   

  96.   // operations to from here out.   

  97.       

  98.   gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesBuffer);   

  99.       

  100.   // Now create an array of vertices for the cube.   

  101.       

  102.   var vertices = [   

  103.     // Front face   

  104.     -1.0, -1.0,  1.0,   

  105.      1.0, -1.0,  1.0,   

  106.      1.0,  1.0,  1.0,   

  107.     -1.0,  1.0,  1.0,   

  108.         

  109.     // Back face   

  110.     -1.0, -1.0, -1.0,   

  111.     -1.0,  1.0, -1.0,   

  112.      1.0,  1.0, -1.0,   

  113.      1.0, -1.0, -1.0,   

  114.         

  115.     // Top face   

  116.     -1.0,  1.0, -1.0,   

  117.     -1.0,  1.0,  1.0,   

  118.      1.0,  1.0,  1.0,   

  119.      1.0,  1.0, -1.0,   

  120.         

  121.     // Bottom face   

  122.     -1.0, -1.0, -1.0,   

  123.      1.0, -1.0, -1.0,   

  124.      1.0, -1.0,  1.0,   

  125.     -1.0, -1.0,  1.0,   

  126.         

  127.     // Right face   

  128.      1.0, -1.0, -1.0,   

  129.      1.0,  1.0, -1.0,   

  130.      1.0,  1.0,  1.0,   

  131.      1.0, -1.0,  1.0,   

  132.         

  133.     // Left face   

  134.     -1.0, -1.0, -1.0,   

  135.     -1.0, -1.0,  1.0,   

  136.     -1.0,  1.0,  1.0,   

  137.     -1.0,  1.0, -1.0   

  138.   ];   

  139.       

  140.   // Now pass the list of vertices into WebGL to build the shape. We   

  141.   // do this by creating a Float32Array from the JavaScript array,   

  142.   // then use it to fill the current vertex buffer.   

  143.       

  144.   gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);   

  145.     

  146.   // Set up the normals for the vertices, so that we can compute lighting.   

  147.       

  148.   cubeVerticesNormalBuffer = gl.createBuffer();   

  149.   gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);   

  150.       

  151.   var vertexNormals = [   

  152.     // Front   

  153.      0.0,  0.0,  1.0,   

  154.      0.0,  0.0,  1.0,   

  155.      0.0,  0.0,  1.0,   

  156.      0.0,  0.0,  1.0,   

  157.         

  158.     // Back   

  159.      0.0,  0.0, -1.0,   

  160.      0.0,  0.0, -1.0,   

  161.      0.0,  0.0, -1.0,   

  162.      0.0,  0.0, -1.0,   

  163.         

  164.     // Top   

  165.      0.0,  1.0,  0.0,   

  166.      0.0,  1.0,  0.0,   

  167.      0.0,  1.0,  0.0,   

  168.      0.0,  1.0,  0.0,   

  169.         

  170.     // Bottom   

  171.      0.0, -1.0,  0.0,   

  172.      0.0, -1.0,  0.0,   

  173.      0.0, -1.0,  0.0,   

  174.      0.0, -1.0,  0.0,   

  175.         

  176.     // Right   

  177.      1.0,  0.0,  0.0,   

  178.      1.0,  0.0,  0.0,   

  179.      1.0,  0.0,  0.0,   

  180.      1.0,  0.0,  0.0,   

  181.         

  182.     // Left   

  183.     -1.0,  0.0,  0.0,   

  184.     -1.0,  0.0,  0.0,   

  185.     -1.0,  0.0,  0.0,   

  186.     -1.0,  0.0,  0.0   

  187.   ];   

  188.       

  189.   gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexNormals),   

  190.                 gl.STATIC_DRAW);   

  191.       

  192.   // Map the texture onto the cube's faces.   

  193.       

  194.   cubeVerticesTextureCoordBuffer = gl.createBuffer();   

  195.   gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesTextureCoordBuffer);   

  196.       

  197.   var textureCoordinates = [   

  198.     // Front   

  199.     0.0,  0.0,   

  200.     1.0,  0.0,   

  201.     1.0,  1.0,   

  202.     0.0,  1.0,   

  203.     // Back   

  204.     0.0,  0.0,   

  205.     1.0,  0.0,   

  206.     1.0,  1.0,   

  207.     0.0,  1.0,   

  208.     // Top   

  209.     0.0,  0.0,   

  210.     1.0,  0.0,   

  211.     1.0,  1.0,   

  212.     0.0,  1.0,   

  213.     // Bottom   

  214.     0.0,  0.0,   

  215.     1.0,  0.0,   

  216.     1.0,  1.0,   

  217.     0.0,  1.0,   

  218.     // Right   

  219.     0.0,  0.0,   

  220.     1.0,  0.0,   

  221.     1.0,  1.0,   

  222.     0.0,  1.0,   

  223.     // Left   

  224.     0.0,  0.0,   

  225.     1.0,  0.0,   

  226.     1.0,  1.0,   

  227.     0.0,  1.0   

  228.   ];   

  229.     

  230.   gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoordinates),   

  231.                 gl.STATIC_DRAW);   

  232.     

  233.   // Build the element array buffer; this specifies the indices   

  234.   // into the vertex array for each face's vertices.   

  235.       

  236.   cubeVerticesIndexBuffer = gl.createBuffer();   

  237.   gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);   

  238.       

  239.   // This array defines each face as two triangles, using the   

  240.   // indices into the vertex array to specify each triangle's   

  241.   // position.   

  242.       

  243.   var cubeVertexIndices = [   

  244.     0,  1,  2,      0,  2,  3,    // front   

  245.     4,  5,  6,      4,  6,  7,    // back   

  246.     8,  9,  10,     8,  10, 11,   // top   

  247.     12, 13, 14,     12, 14, 15,   // bottom   

  248.     16, 17, 18,     16, 18, 19,   // right   

  249.     20, 21, 22,     20, 22, 23    // left   

  250.   ]   

  251.       

  252.   // Now send the element array to GL   

  253.       

  254.   gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,   

  255.       new Uint16Array(cubeVertexIndices), gl.STATIC_DRAW);   

  256. }   

  257.     

  258. //   

  259. // initTextures   

  260. //   

  261. // Initialize the textures we'll be using, then initiate a load of   

  262. // the texture images. The handleTextureLoaded() callback will finish   

  263. // the job; it gets called each time a texture finishes loading.   

  264. //   

  265. // TODO#1 Start   

  266. function createCubeTexture(text) {   

  267.                     

  268.     // create a hidden canvas to draw the texture   

  269.     var canvas = document.createElement('canvas');   

  270.     canvas.id     = "hiddenCanvas";   

  271.     canvas.width  = 512;   

  272.     canvas.height = 512;   

  273.     canvas.style.display   = "none";   

  274.     var body = document.getElementsByTagName("body")[0];   

  275.     body.appendChild(canvas);          

  276.     

  277.     // draw texture   

  278.     var cubeImage = document.getElementById('hiddenCanvas');   

  279.     var ctx = cubeImage.getContext('2d');   

  280.     ctx.beginPath();   

  281.     ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);              

  282.     ctx.fillStyle = 'white';   

  283.     ctx.fill();   

  284.     ctx.fillStyle = 'black';   

  285.     ctx.font = "65px Arial";   

  286.     ctx.textAlign = 'center';              

  287.     ctx.fillText(text, ctx.canvas.width / 2, ctx.canvas.height / 2);   

  288.     ctx.restore();          

  289.     

  290.     // create new texture   

  291.     var texture = gl.createTexture();   

  292.     gl.bindTexture(gl.TEXTURE_2D, texture);   

  293.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);   

  294.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);   

  295.     gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);   

  296.     handleTextureLoaded(cubeImage, texture)   

  297.         

  298.     return texture;   

  299. }   

  300. // TODO#1 End   

  301.      

  302. function handleTextureLoaded(image, texture) {   

  303.   gl.bindTexture(gl.TEXTURE_2D, texture);   

  304.   gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);   

  305.   gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);   

  306.   gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);   

  307.   gl.generateMipmap(gl.TEXTURE_2D);   

  308.   gl.bindTexture(gl.TEXTURE_2D, null);   

  309. }   

  310.     

  311. //   

  312. // drawScene   

  313. //   

  314. // Draw the scene.   

  315. //   

  316. function drawScene() {   

  317.   // Clear the canvas before we start drawing on it.   

  318.     

  319.   gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);   

  320.       

  321.   // Establish the perspective with which we want to view the   

  322.   // scene. Our field of view is 45 degrees, with a width/height   

  323.   // ratio of 640:480, and we only want to see objects between 0.1 units   

  324.   // and 100 units away from the camera.   

  325.       

  326.   perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0);   

  327.       

  328.   // Set the drawing position to the "identity" point, which is   

  329.   // the center of the scene.   

  330.       

  331.   loadIdentity();   

  332.       

  333.   // Now move the drawing position a bit to where we want to start   

  334.   // drawing the cube.   

  335.       

  336.   mvTranslate([0.0, 0.0, -6.0]);   

  337.       

  338.   // Save the current matrix, then rotate before we draw.   

  339.       

  340.   mvPushMatrix();   

  341.   mvRotate(cubeRotation, [1, 0, 1]);   

  342.       

  343.   // Draw the cube by binding the array buffer to the cube's vertices   

  344.   // array, setting attributes, and pushing it to GL.   

  345.       

  346.   gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesBuffer);   

  347.   gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);   

  348.       

  349.   // Set the texture coordinates attribute for the vertices.   

  350.       

  351.   gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesTextureCoordBuffer);   

  352.   gl.vertexAttribPointer(textureCoordAttribute, 2, gl.FLOAT, false, 0, 0);   

  353.       

  354.   // Bind the normals buffer to the shader attribute.   

  355.       

  356.   gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);   

  357.   gl.vertexAttribPointer(vertexNormalAttribute, 3, gl.FLOAT, false, 0, 0);   

  358.       

  359.   // Specify the texture to map onto the faces.   

  360.       

  361.   gl.activeTexture(gl.TEXTURE0);   

  362.   gl.bindTexture(gl.TEXTURE_2D, cubeTexture);   

  363.   gl.uniform1i(gl.getUniformLocation(shaderProgram, "uSampler"), 0);   

  364.       

  365.   // Draw the cube.   

  366.       

  367.   gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);   

  368.   setMatrixUniforms();   

  369.   gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0);   

  370.       

  371.   // Restore the original matrix   

  372.       

  373.   mvPopMatrix();   

  374.       

  375.   // Update the rotation for the next draw, if it's time to do so.   

  376.       

  377.   var currentTime = (new Date).getTime();   

  378.   if (lastCubeUpdateTime) {   

  379.     var delta = currentTime - lastCubeUpdateTime;   

  380.         

  381.     cubeRotation += (30 * delta) / 1000.0;   

  382.   }   

  383.       

  384.   lastCubeUpdateTime = currentTime;   

  385. }   

  386.     

  387. //   

  388. // initShaders   

  389. //   

  390. // Initialize the shaders, so WebGL knows how to light our scene.   

  391. //   

  392. function initShaders() {   

  393.   var fragmentShader = getShader(gl, "shader-fs");   

  394.   var vertexShader = getShader(gl, "shader-vs");   

  395.       

  396.   // Create the shader program   

  397.       

  398.   shaderProgram = gl.createProgram();   

  399.   gl.attachShader(shaderProgram, vertexShader);   

  400.   gl.attachShader(shaderProgram, fragmentShader);   

  401.   gl.linkProgram(shaderProgram);   

  402.       

  403.   // If creating the shader program failed, alert   

  404.       

  405.   if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {   

  406.     alert("Unable to initialize the shader program.");   

  407.   }   

  408.       

  409.   gl.useProgram(shaderProgram);   

  410.       

  411.   vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");   

  412.   gl.enableVertexAttribArray(vertexPositionAttribute);   

  413.       

  414.   textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");   

  415.   gl.enableVertexAttribArray(textureCoordAttribute);   

  416.       

  417.   vertexNormalAttribute = gl.getAttribLocation(shaderProgram, "aVertexNormal");   

  418.   gl.enableVertexAttribArray(vertexNormalAttribute);   

  419. }   

  420.     

  421. //   

  422. // getShader   

  423. //   

  424. // Loads a shader program by scouring the current document,   

  425. // looking for a script with the specified ID.   

  426. //   

  427. function getShader(gl, id) {   

  428.   var shaderScript = document.getElementById(id);   

  429.       

  430.   // Didn't find an element with the specified ID; abort.   

  431.       

  432.   if (!shaderScript) {   

  433.     return null;   

  434.   }   

  435.       

  436.   // Walk through the source element's children, building the   

  437.   // shader source string.   

  438.       

  439.   var theSource = "";   

  440.   var currentChild = shaderScript.firstChild;   

  441.       

  442.   while(currentChild) {   

  443.     if (currentChild.nodeType == 3) {   

  444.       theSource += currentChild.textContent;   

  445.     }   

  446.         

  447.     currentChildcurrentChild = currentChild.nextSibling;   

  448.   }   

  449.       

  450.   // Now figure out what type of shader script we have,   

  451.   // based on its MIME type.   

  452.       

  453.   var shader;   

  454.       

  455.   if (shaderScript.type == "x-shader/x-fragment") {   

  456.     shader = gl.createShader(gl.FRAGMENT_SHADER);   

  457.   } else if (shaderScript.type == "x-shader/x-vertex") {   

  458.     shader = gl.createShader(gl.VERTEX_SHADER);   

  459.   } else {   

  460.     return null;  // Unknown shader type   

  461.   }   

  462.       

  463.   // Send the source to the shader object   

  464.       

  465.   gl.shaderSource(shader, theSource);   

  466.       

  467.   // Compile the shader program   

  468.       

  469.   gl.compileShader(shader);   

  470.       

  471.   // See if it compiled successfully   

  472.       

  473.   if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {   

  474.     alert("An error occurred compiling the shaders: " + gl.getShaderInfoLog(shader));   

  475.     return null;   

  476.   }   

  477.       

  478.   return shader;   

  479. }   

  480.     

  481. //   

  482. // Matrix utility functions   

  483. //   

  484.     

  485. function loadIdentity() {   

  486.   mvMatrix = Matrix.I(4);   

  487. }   

  488.     

  489. function multMatrix(m) {   

  490.   mvMatrixmvMatrix = mvMatrix.x(m);   

  491. }   

  492.     

  493. function mvTranslate(v) {   

  494.   multMatrix(Matrix.Translation($V([v[0], v[1], v[2]])).ensure4x4());   

  495. }   

  496.     

  497. function setMatrixUniforms() {   

  498.   var pUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");   

  499.   gl.uniformMatrix4fv(pUniform, false, new Float32Array(perspectiveMatrix.flatten()));   

  500.     

  501.   var mvUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");   

  502.   gl.uniformMatrix4fv(mvUniform, false, new Float32Array(mvMatrix.flatten()));   

  503.       

  504.   var normalMatrix = mvMatrix.inverse();   

  505.   normalMatrixnormalMatrix = normalMatrix.transpose();   

  506.   var nUniform = gl.getUniformLocation(shaderProgram, "uNormalMatrix");   

  507.   gl.uniformMatrix4fv(nUniform, false, new Float32Array(normalMatrix.flatten()));   

  508. }   

  509.     

  510. var mvMatrixStack = [];   

  511.     

  512. function mvPushMatrix(m) {   

  513.   if (m) {   

  514.     mvMatrixStack.push(m.dup());   

  515.     mmvMatrix = m.dup();   

  516.   } else {   

  517.     mvMatrixStack.push(mvMatrix.dup());   

  518.   }   

  519. }   

  520.     

  521. function mvPopMatrix() {   

  522.   if (!mvMatrixStack.length) {   

  523.     throw("Can't pop from an empty matrix stack.");   

  524.   }   

  525.       

  526.   mvMatrix = mvMatrixStack.pop();   

  527.   return mvMatrix;   

  528. }   

  529.     

  530. function mvRotate(angle, v) {   

  531.   var inRadians = angle * Math.PI / 180.0;   

  532.       

  533.   var m = Matrix.Rotation(inRadians, $V([v[0], v[1], v[2]])).ensure4x4();   

  534.   multMatrix(m);   

  535. }  

到此,相信大家对“如何在HTML5的浏览器上运行WebGL程序”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 如何在HTML5的浏览器上运行WebGL程序

本文链接: https://lsjlt.com/news/81962.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在HTML5的浏览器上运行WebGL程序
    本篇内容主要讲解“如何在HTML5的浏览器上运行WebGL程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在HTML5的浏览器上运行WebGL程序”吧!&...
    99+
    2024-04-02
  • vue文件如何在浏览器运行
    这篇文章主要介绍vue文件如何在浏览器运行,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! vue文件在浏览器运行的方法:1、打开cmd命令窗口,使用cd命...
    99+
    2024-04-02
  • php文件如何在浏览器运行
    这篇文章主要介绍了php文件如何在浏览器运行,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二...
    99+
    2023-06-14
  • 如何让HTML5和CSS3网站在微软的浏览器中也能运行
    这篇文章给大家介绍如何让HTML5和CSS3网站在微软的浏览器中也能运行,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 起初,IE其实也是一款非常有进取心...
    99+
    2024-04-02
  • 浏览器中如何运行Node.js
    这篇文章给大家分享的是有关浏览器中如何运行Node.js的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一切要从收到一封邮件开始大早上,我收到一封邮件,StackBlitz说正在与Next.js和Google的团队...
    99+
    2023-06-15
  • javascript在浏览器运行的方法
    小编给大家分享一下javascript在浏览器运行的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!javascript在浏览器运行的方法:首先打开需要调试的网...
    99+
    2023-06-14
  • 如何在云服务器上运行程序
    要在云服务器上运行程序,你可以按照以下步骤进行操作:1. 选择合适的云服务提供商:根据你的需求选择适合的云服务器实例类型。2. 创建...
    99+
    2023-08-09
    云服务器
  • 如何在linux上直接运行python程序
    如何在linux上直接运行python程序 一、前言二、具体步骤 一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习如何在linux上直接运行python程...
    99+
    2023-08-31
    python linux 开发语言
  • 如何在Android设备上运行Python程序
    如何在Android设备上运行Python程序 在Android设备上运行Python程序可以为用户提供更广泛的开发和使用选择。本文将介绍几种在Android上运行Python的方法,并附上相应的源代...
    99+
    2023-10-23
    android python 开发语言 Android
  • 如何在Nodejs或者浏览器直接运行esm代码
    今天就跟大家聊聊有关如何在Nodejs或者浏览器直接运行esm代码,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 怎么在...
    99+
    2024-04-02
  • 在Mac电脑上同时运行不同版本的chrome浏览器
    正好最近有个需求,然后要在低版本的chrome上看看有些新的api能否跑起来,但是现在用的chrome版本是最新的112.X的,我随便下载了个低版本的浏览器,但是下完后,打开这个低版本的chrome,...
    99+
    2023-09-30
    chrome macos 前端
  • 如何实现让ie浏览器成为支持html5的浏览器
    本篇内容主要讲解“如何实现让ie浏览器成为支持html5的浏览器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现让ie浏览器成为支持html5的浏览器”吧...
    99+
    2024-04-02
  • 如何在Ubuntu20.04上安装MicrosoftEdge浏览器
    Microsoft Edge是为现代Web构建的快速,易于使用且安全的浏览器。稳定的浏览器版本在Windows,macOS,iOS和Android上可用,而开发人员预览版在Linux上可用。Edge允许您在所有设备上同步书签,...
    99+
    2022-05-21
    Ubuntu安装Microsoft Edge浏览器
  • 深度剖析 Vue3 在浏览器的运行原理
    目录前言首次渲染patch 函数processComponent 方法setupComponentsetupRenderEffect前言 上一讲深度解析 Vue3 ...
    99+
    2024-04-02
  • 浏览器如何启用java小程序
    首先确认电脑已经安装了java程序,可以在开始菜单的"所有程序"中找到它如果你的java安装已经很长时间了,建议先进行更新;如果是新安装的则直接切换到"安全"选项,并勾选“启用浏览器中的Java内容”,并"确定"保存设置免费视频教程分享:j...
    99+
    2020-02-04
    浏览器 启用 java 小程序
  • 如何用C#做浏览器源程序
    这篇文章主要讲解了“如何用C#做浏览器源程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用C#做浏览器源程序”吧!C#做浏览器源程序了解C#源程序代码,就可以比较容易编写一个属于自己的...
    99+
    2023-06-17
  • 在云服务器上运行程序的步骤
    1. 选择云服务提供商 首先,你需要选择一个云服务提供商,例如亚马逊AWS、微软Azure或谷歌云平台。这些提供商都有自己的云服务器服务,你可以根据自己的需求选择适合的服务。 2. 创建云服务器实例 在选择了云服务提供商后,你需要创建一个...
    99+
    2023-10-27
    步骤 器上 程序
  • vue可以在浏览器运行的原因是什么
    本文小编为大家详细介绍“vue可以在浏览器运行的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue可以在浏览器运行的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Vue 是一种现代化的前端...
    99+
    2023-07-05
  • html5中canvas移动浏览器上如何实现图片压缩上传
    这篇文章主要介绍html5中canvas移动浏览器上如何实现图片压缩上传,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、<input type="file"...
    99+
    2024-04-02
  • 如何在微信内外部浏览器唤起小程序
    目的:通过发送短信召回流失用户。 官方文档地址 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-sc...
    99+
    2023-09-10
    小程序
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作