您現在的位置是:電腦技術吧?>? 組裝維修 ??>??瀏覽器應用程序,谷歌瀏覽器擴展程序??>??正文詳情

瀏覽器應用程序,谷歌瀏覽器擴展程序

前又菡2019-11-27 08:33:40 人圍觀
簡介瀏覽器打開目前,只有少數瀏覽器支持webgl,請參閱我的另一篇文章:我可以使用webgl嗎?。下面的例子是windows下的chrome 16/23和Android下的FlE瀏覽器進入

前提條件和預期結果  目前只有少數的瀏覽器支持 WebGL ,請看我的另外一篇文章:Can I use WebGL?.  下面的例子是在 Windows 下的 Chrome 16/23 以及 Android 下的 Firefox 17 進行測試。

如果你使用的是非兼容瀏覽器訪問則會彈出一個警告。

  圖1:包含 Hello world 文本的動畫的 WebGL 立方體  在兼容 HTML5 的瀏覽器上,你將會看到如下圖所示的帶動畫效果的立方體:

  圖2: 示例運行的屏幕截圖  該代碼基于 Lighting in WebGL - How to simulate lighting effects in your WebGL context - 非常感謝這篇教程。

在該實例初始運行時,動畫的立方體是通過一個靜態的 Bitmap 圖形對象渲染的。

  下面的代碼演示如何在程序中動態的渲染文本:  XML/HTML Code復制內容到剪貼板  // TODO #1 New method to create a texture  function createCubeTexture(text) {  ...  }  在這里使用 gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); 是非常重要的,用來確保寫文本時不會前后顛倒。

剩下的就很容易理解了:  XML/HTML Code復制內容到剪貼板  // TODO #2 Assign the created texture for display  cubeTexture = createCubeTexture(Hello World!); 源碼// File #1: webgl-demo.htmXML/HTML Code復制內容到剪貼板

    html head titleWebGL - Hello World!/title meta http-equiv=Content-Type content=text/html; charset=utf-8 script src=sylvester.js type=text/javascript/script script src=glUtils.js type=text/javascript/script script src=webgl-demo.js type=text/javascript/script !-- Fragment shader program -- script id=shader-fs type=x-shader/x-fragment varying highp vec2 vTextureCoord; varying highp vec3 vLighting; uniform sampler2D uSampler; void main(void) { highp vec4 texelColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)); gl_FragColor = vec4(texelColor.rgb * vLighting, texelColor.a); } /script !-- Vertex shader program -- script id=shader-vs type=x-shader/x-vertex attribute highp vec3 aVertexNormal; attribute highp vec3 aVertexPosition; attribute highp vec2 aTextureCoord; uniform highp mat4 uNormalMatrix; uniform highp mat4 uMVMatrix; uniform highp mat4 uPMatrix; varying highp vec2 vTextureCoord; varying highp vec3 vLighting; void main(void) { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); vTextureCoord = aTextureCoord; // Apply lighting effect highp vec3 ambientLight = vec3(0.6, 0.6, 0.6); highp vec3 directionalLightColor = vec3(0.5, 0.5, 0.75); highp vec3 directionalVector = vec3(0.85, 0.8, 0.75); highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0); highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0); vLighting = ambientLight (directionalLightColor * directional); } /script /head body onload=start() canvas id=glcanvas width=640 height=480 Your browser doesn't appear to support the HTML5 codecanvas/code element. /canvas /body /html
  // File #02: webgl-demo.js  XML/HTML Code復制內容到剪貼板  var canvas;  var gl;  var cubeVerticesBuffer;  var cubeVerticesTextureCoordBuffer;  var cubeVerticesIndexBuffer;  var cubeVerticesIndexBuffer;  var cubeRotation = 0.0;  var lastCubeUpdateTime = 0;  var cubeImage;  var cubeTexture;  var mvMatrix;  var shaderProgram;  var vertexPositionAttribute;  var vertexNormalAttribute;  var textureCoordAttribute;  var perspectiveMatrix;  //  // start  //  // Called when the canvas is created to get the ball rolling.  //  function start() {  canvas = document.getElementById(glcanvas);  initWebGL(canvas); // Initialize the GL context  // Only continue if WebGL is available and working  if (gl) {  gl.clearColor(0.0, 0.0, 0.0, 1.0); // Clear to black, fully opaque  gl.clearDepth(1.0); // Clear everything  gl.enable(gl.DEPTH_TEST); // Enable depth testing  gl.depthFunc(gl.LEQUAL); // Near things obscure far things  // Initialize the shaders; this is where all the lighting for the  // vertices and so forth is established.  initShaders();  // Here's where we call the routine that builds all the objects  // we'll be drawing.  initBuffers();  // Next, load and set up the textures we'll be using.  // TODO#2 Start  cubeTexture = createCubeTexture(Hello World!);  // TODO#2 End  // Set up to draw the scene periodically.  setInterval(drawScene, 15);  }  }  //  // initWebGL  //  // Initialize WebGL, returning the GL context or null if  // WebGL isn't available or could not be initialized.  //  function initWebGL() {  gl = null;  try {  gl = canvas.getContext(experimental-webgl);  }  catch(e) {  }  // If we don't have a GL context, give up now  if (!gl) {  alert(Unable to initialize WebGL. Your browser may not support it.);  }  }  //  // initBuffers  //  // Initialize the buffers we'll need. For this demo, we just have  // one object -- a simple two-dimensional cube.  //  function initBuffers() {  // Create a buffer for the cube's vertices.  cubeVerticesBuffer = gl.createBuffer();  // Select the cubeVerticesBuffer as the one to apply vertex  // operations to from here out.  gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesBuffer);  // Now create an array of vertices for the cube.  var vertices = [  // Front face  -1.0, -1.0, 1.0,  1.0, -1.0, 1.0,  1.0, 1.0, 1.0,  -1.0, 1.0, 1.0,  // Back face  -1.0, -1.0, -1.0,  -1.0, 1.0, -1.0,  1.0, 1.0, -1.0,  1.0, -1.0, -1.0,  // Top face  -1.0, 1.0, -1.0,  -1.0, 1.0, 1.0,  1.0, 1.0, 1.0,  1.0, 1.0, -1.0,  // Bottom face  -1.0, -1.0, -1.0,  1.0, -1.0, -1.0,  1.0, -1.0, 1.0,  -1.0, -1.0, 1.0,  // Right face  1.0, -1.0, -1.0,  1.0, 1.0, -1.0,  1.0, 1.0, 1.0,  1.0, -1.0, 1.0,  // Left face  -1.0, -1.0, -1.0,  -1.0, -1.0, 1.0,  -1.0, 1.0, 1.0,  -1.0, 1.0, -1.0  ];  // Now pass the list of vertices into WebGL to build the shape. We  // do this by creating a Float32Array from the JavaScript array,  // then use it to fill the current vertex buffer.  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);  // Set up the normals for the vertices, so that we can compute lighting.  cubeVerticesNormalBuffer = gl.createBuffer();  gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);  var vertexNormals = [  // Front  0.0, 0.0, 1.0,  0.0, 0.0, 1.0,  0.0, 0.0, 1.0,  0.0, 0.0, 1.0,  // Back  0.0, 0.0, -1.0,  0.0, 0.0, -1.0,  0.0, 0.0, -1.0,  0.0, 0.0, -1.0,  // Top  0.0, 1.0, 0.0,  0.0, 1.0, 0.0,  0.0, 1.0, 0.0,  0.0, 1.0, 0.0,  // Bottom  0.0, -1.0, 0.0,  0.0, -1.0, 0.0,  0.0, -1.0, 0.0,  0.0, -1.0, 0.0,  // Right  1.0, 0.0, 0.0,  1.0, 0.0, 0.0,  1.0, 0.0, 0.0,  1.0, 0.0, 0.0,  // Left  -1.0, 0.0, 0.0,  -1.0, 0.0, 0.0,  -1.0, 0.0, 0.0,  -1.0, 0.0, 0.0  ];  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexNormals),  gl.STATIC_DRAW);  // Map the texture onto the cube's faces.  cubeVerticesTextureCoordBuffer = gl.createBuffer();  gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesTextureCoordBuffer);  var textureCoordinates = [  // Front  0.0, 0.0,  1.0, 0.0,  1.0, 1.0,  0.0, 1.0,  // Back  0.0, 0.0,  1.0, 0.0,  1.0, 1.0,  0.0, 1.0,  // Top  0.0, 0.0,  1.0, 0.0,  1.0, 1.0,  0.0, 1.0,  // Bottom  0.0, 0.0,  1.0, 0.0,  1.0, 1.0,  0.0, 1.0,  // Right  0.0, 0.0,  1.0, 0.0,  1.0, 1.0,  0.0, 1.0,  // Left  0.0, 0.0,  1.0, 0.0,  1.0, 1.0,  0.0, 1.0  ];  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoordinates),  gl.STATIC_DRAW);  // Build the element array buffer; this specifies the indices  // into the vertex array for each face's vertices.  cubeVerticesIndexBuffer = gl.createBuffer();  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);  // This array defines each face as two triangles, using the  // indices into the vertex array to specify each triangle's  // position.  var cubeVertexIndices = [  0, 1, 2, 0, 2, 3, // front  4, 5, 6, 4, 6, 7, // back  8, 9, 10, 8, 10, 11, // top  12, 13, 14, 12, 14, 15, // bottom  16, 17, 18, 16, 18, 19, // right  20, 21, 22, 20, 22, 23 // left  ]  // Now send the element array to GL  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,  new Uint16Array(cubeVertexIndices), gl.STATIC_DRAW);  }  //  // initTextures  //  // Initialize the textures we'll be using, then initiate a load of  // the texture images. The handleTextureLoaded() callback will finish  // the job; it gets called each time a texture finishes loading.  //  // TODO#1 Start  function createCubeTexture(text) {  // create a hidden canvas to draw the texture  var canvas = document.createElement('canvas');  canvas.id = hiddenCanvas;  canvas.width = 512;  canvas.height = 512;  canvas.style.display = none;  var body = document.getElementsByTagName(body)[0];  body.appendChild(canvas);  // draw texture  var cubeImage = document.getElementById('hiddenCanvas');  var ctx = cubeImage.getContext('2d');  ctx.beginPath();  ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);  ctx.fillStyle = 'white';  ctx.fill();  ctx.fillStyle = 'black';  ctx.font = 65px Arial;  ctx.textAlign = 'center';  ctx.fillText(text, ctx.canvas.width / 2, ctx.canvas.height / 2);  ctx.restore();  // create new texture  var texture = gl.createTexture();  gl.bindTexture(gl.TEXTURE_2D, texture);  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);  handleTextureLoaded(cubeImage, texture)  return texture;  }  // TODO#1 End  function handleTextureLoaded(image, texture) {  gl.bindTexture(gl.TEXTURE_2D, texture);  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);  gl.generateMipmap(gl.TEXTURE_2D);  gl.bindTexture(gl.TEXTURE_2D, null);  }  //  // drawScene  //  // Draw the scene.  //  function drawScene() {  // Clear the canvas before we start drawing on it.  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);  // Establish the perspective with which we want to view the  // scene. Our field of view is 45 degrees, with a width/height  // ratio of 640:480, and we only want to see objects between 0.1 units  // and 100 units away from the camera.  perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0);  // Set the drawing position to the identity point, which is  // the center of the scene.  loadIdentity();  // Now move the drawing position a bit to where we want to start  // drawing the cube.  mvTranslate([0.0, 0.0, -6.0]);  // Save the current matrix, then rotate before we draw.  mvPushMatrix();  mvRotate(cubeRotation, [1, 0, 1]);  // Draw the cube by binding the array buffer to the cube's vertices  // array, setting attributes, and pushing it to GL.  gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesBuffer);  gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);  // Set the texture coordinates attribute for the vertices.  gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesTextureCoordBuffer);  gl.vertexAttribPointer(textureCoordAttribute, 2, gl.FLOAT, false, 0, 0);  // Bind the normals buffer to the shader attribute.  gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);  gl.vertexAttribPointer(vertexNormalAttribute, 3, gl.FLOAT, false, 0, 0);  // Specify the texture to map onto the faces.  gl.activeTexture(gl.TEXTURE0);  gl.bindTexture(gl.TEXTURE_2D, cubeTexture);  gl.uniform1i(gl.getUniformLocation(shaderProgram, uSampler), 0);  // Draw the cube.  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVerticesIndexBuffer);  setMatrixUniforms();  gl.drawElements(gl.TRIANGLES, 36, gl.UNSIGNED_SHORT, 0);  // Restore the original matrix  mvPopMatrix();  // Update the rotation for the next draw, if it's time to do so.  var currentTime = (new Date).getTime();  if (lastCubeUpdateTime) {  var delta = currentTime - lastCubeUpdateTime;  cubeRotation = (30 * delta) / 1000.0;  }  lastCubeUpdateTime = currentTime;  }  //  // initShaders  //  // Initialize the shaders, so WebGL knows how to light our scene.  //  function initShaders() {  var fragmentShader = getShader(gl, shader-fs);  var vertexShader = getShader(gl, shader-vs);  // Create the shader program  shaderProgram = gl.createProgram();  gl.attachShader(shaderProgram, vertexShader);  gl.attachShader(shaderProgram, fragmentShader);  gl.linkProgram(shaderProgram);  // If creating the shader program failed, alert  if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {  alert(Unable to initialize the shader program.);  }  gl.useProgram(shaderProgram);  vertexPositionAttribute = gl.getAttribLocation(shaderProgram, aVertexPosition);  gl.enableVertexAttribArray(vertexPositionAttribute);  textureCoordAttribute = gl.getAttribLocation(shaderProgram, aTextureCoord);  gl.enableVertexAttribArray(textureCoordAttribute);  vertexNormalAttribute = gl.getAttribLocation(shaderProgram, aVertexNormal);  gl.enableVertexAttribArray(vertexNormalAttribute);  }  //  // getShader  //  // Loads a shader program by scouring the current document,  // looking for a script with the specified ID.  //  function getShader(gl, id) {  var shaderScript = document.getElementById(id);  // Didn't find an element with the specified ID; abort.  if (!shaderScript) {  return null;  }  // Walk through the source element's children, building the  // shader source string.  var theSource = ;  var currentChild = shaderScript.firstChild;  while(currentChild) {  if (currentChild.nodeType == 3) {  theSource = currentChild.textContent;  }  currentChildcurrentChild = currentChild.nextSibling;  }  // Now figure out what type of shader script we have,  // based on its MIME type.  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; // Unknown shader type  }  // Send the source to the shader object  gl.shaderSource(shader, theSource);  // Compile the shader program  gl.compileShader(shader);  // See if it compiled successfully  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {  alert(An error occurred compiling the shaders: gl.getShaderInfoLog(shader));  return null;  }  return shader;  }  //  // Matrix utility functions  //  function loadIdentity() {  mvMatrix = Matrix.I(4);  }  function multMatrix(m) {  mvMatrixmvMatrix = mvMatrix.x(m);  }  function mvTranslate(v) {  multMatrix(Matrix.Translation($V([v[0], v[1], v[2]])).ensure4x4());  }  function setMatrixUniforms() {  var pUniform = gl.getUniformLocation(shaderProgram, uPMatrix);  gl.uniformMatrix4fv(pUniform, false, new Float32Array(perspectiveMatrix.flatten()));  var mvUniform = gl.getUniformLocation(shaderProgram, uMVMatrix);  gl.uniformMatrix4fv(mvUniform, false, new Float32Array(mvMatrix.flatten()));  var normalMatrix = mvMatrix.inverse();  normalMatrixnormalMatrix = normalMatrix.transpose();  var nUniform = gl.getUniformLocation(shaderProgram, uNormalMatrix);  gl.uniformMatrix4fv(nUniform, false, new Float32Array(normalMatrix.flatten()));  }  var mvMatrixStack = [];  function mvPushMatrix(m) {  if (m) {  mvMatrixStack.push(m.dup());  mmvMatrix = m.dup();  } else {  mvMatrixStack.push(mvMatrix.dup());  }  }  function mvPopMatrix() {  if (!mvMatrixStack.length) {  throw(Can't pop from an empty matrix stack.);  }  mvMatrix = mvMatrixStack.pop();  return mvMatrix;  }  function mvRotate(angle, v) {  var inRadians = angle * Math.PI / 180.0;  var m = Matrix.Rotation(inRadians, $V([v[0], v[1], v[2]])).ensure4x4();  multMatrix(m);  }

版權聲明:本文由 前又菡 整理編輯。

原標題:使用瀏覽器,瀏覽器都有哪些

轉載注明出處:http://www.dn9ww09s.icu/assemble/14527.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 一加系統使用小技巧,一加系統使用教程

    一加系統使用小技巧,一加系統使用教程 相關圖片安卓系統小竅門一般來說,了解一些windows系統的操作技巧對我們的辦公有很大的幫助,比如節省時間,提高工作效率。所以超人給你帶來了一些關于Windows系統操作的提示,感興小米系統...

  • win7系統設置定時關機,win7定時關機怎么設置

    win7系統設置定時關機,win7定時關機怎么設置 相關圖片win7定時關機在辦公室里,經常會出現文件需要離開電腦傳輸的情況,很多電腦用戶會選擇安裝第三方軟件來設置win7系統自動關機。也許有很多用戶不喜歡這個操作,所以今天的編輯會教...

  • 哈羅單車計費方式,共享單車計費方式

    哈羅單車計費方式,共享單車計費方式 相關圖片共享單車怎樣收費共享單車現在是這個城市一道美麗的風景線。它有助于我們解決最近幾公里的交通障礙,緩解城市交通。但每輛自行車的收費都不一樣。小明自行車多少錢?我們和小...

  • 光影涂鴉,光影涂鴉怎么拍

    光影涂鴉,光影涂鴉怎么拍 相關圖片手機拍攝光影涂鴉這種沒有繪畫的涂鴉很受歡迎。它的魅力不僅體現在夜晚的輝煌,更體現在人們對一幅隨時都會幻滅的美麗圖畫的迷戀。總之,在黑暗中,用手電筒對著相機,揮手拍...

  • 大連到湖北,湖北大學

    大連到湖北,湖北大學 相關圖片大連在哪里湖北張達是一款面向大學生的手機信息軟件。除了豐富的在線信息外,還為大學生提供了便捷的在線功能。但近日,一位小伙伴回應稱,湖北省大連市不使用互聯網。那么大...

  • word怎么打不開了怎么辦,所有word文檔都打不開

    word怎么打不開了怎么辦,所有word文檔都打不開 相關圖片word注冊表數據庫損壞Word是我們日常生活中經常使用的辦公應用軟件之一。但是,如果文字不能打開,就會更加混亂,影響工作效率。如果遇到word無法打開并發送錯誤報告的情況,您知...

  • 折扇教程,折扇制作教程

    折扇教程,折扇制作教程 相關圖片折扇效果圖:第一步:畫原型第二步:畫原型第三步:補充第四步:修改第五步:拿扇形圈第六步:導入材料圖片美化第七步:文字裝飾材料圖片折扇怎么拿...

  • 內涵段子,內涵段子里發的網站

    內涵段子,內涵段子里發的網站 相關圖片發段子內涵段是一種流行的段共享應用。在這個軟件中,用戶可以閱讀各種有趣的故事。那么如何為內容段發送視頻呢?接下來,超人軟件編輯將介紹內容段iPhone視頻的上傳端適合發朋...

  • 電池狀態,電池狀態顯示維修

    電池狀態,電池狀態顯示維修 相關圖片蘋果電池顯示維修解決移動設備在網絡流量中的份額越來越大,其貢獻的網絡流量也越來越大,我們已經分別為移動設備創建了一些api和設計概念。一個非常典型的例子是W3C電池狀態A...

  • 文件轉換格式,文件是pdf格式怎么轉換

    文件轉換格式,文件是pdf格式怎么轉換 相關圖片zip格式怎么轉換pdfPdf文件在office中非常實用,但由于不易隨意編輯,很多人不習慣直接編寫Pdf文件。此時,我們可以編輯文檔,然后將其轉換為PDF格式。借助于快速的PDF轉換pdf怎么轉換...

熱評文章

  • usb接口有幾種,usb六種接口

    usb接口有幾種,usb六種接口 相關圖片usb c接口USB設備一連接,USB接口就會自動直接開始運行,這是一件讓人無法忍受的事情。那么,如何防止USB接口直接在計算機中運行呢?超人小編提醒你,如果你使用win7,usb2.0接口...

  • 利用通道實現了,可以利用BBS實現的是

    利用通道實現了,可以利用BBS實現的是 相關圖片炫酷的頭像今天,讓我們在Carl philipebrenner的網站上探索一個微妙而有趣的動畫效果。當鼠標通過網格元素時,將會有一個微妙的動畫。網格元素變得透明,每個邊都炫酷背景圖...

  • 圖片轉換ppt,如何將ppt轉換為圖片

    圖片轉換ppt,如何將ppt轉換為圖片 相關圖片圖片變成ppt雖然PPT在日常辦公中被廣泛用作演示文稿,但也有人將PPT轉換成圖片,以防被他人復制。所以問題是,我們如何將PPT批量轉換成圖像?讓我們看看快速的PDF轉換ppt轉高清圖片...

  • template標簽,template

    template標簽,template 相關圖片java中template標簽一、HTML5模板元素的初始元素基本確定在2013年出現。你為什么用它?現在只是聲明它是一個模板元素,我們將模板HTML嵌入到HTML中,通常是這樣寫的:復制Xtemplate file...

  • 京東金條10000一年利息,京東金條一萬一天利息

    京東金條10000一年利息,京東金條一萬一天利息 相關圖片京東金條分期6期怎樣算京東金條盈利是京東正式推出的個人貸款產品。很多人說他們想用它,但他們對興趣知之甚少。京東金條的興趣如何?京東金條的利息高嗎?接下來,超人軟件將...

  • 水晶球制作教程,自己制作水晶球的方法

    水晶球制作教程,自己制作水晶球的方法 相關圖片自制水晶球這篇文章是要做一個漂亮的超級水晶球煙花。方法很簡單。它是用圓形工具畫幾個球,把它們放在一起,調節光線,從而達到超光效的水晶球。原文:http://www.polps水晶球制作...

  • Excel怎么轉換成PDF,PDF轉換成Excel

    Excel怎么轉換成PDF,PDF轉換成Excel 相關圖片pdf轉換成excel是空白Excel是日常辦公中必不可少的數據處理軟件之一。它的獨特之處在于它是以表格的形式出現的,而且這個表格還具有計算功能。它對于統計、報表和數據排序是必不可...

  • 繪圖工具在哪,繪圖工具都有什么

    繪圖工具在哪,繪圖工具都有什么 相關圖片excel 繪圖工具在哪HTML5無疑是目前最流行的技術。每個網頁設計師都在討論這種神奇的標記語言的興起。HTML5是一種不費吹灰之力的標記語言,但它可以提供迷人的藝術特性,幫助網頁設...

  • 美顏相機大頭貼模板,美顏相機最新版

    美顏相機大頭貼模板,美顏相機最新版 相關圖片美顏相機孩子們有沒有看到美相機的代言人angelababy,對他為美相機宣傳的動畫海報非常興奮?他們想自己試試。那么如何使用美女相機的卡通貼紙呢?下面我們就來看看:美顏相機怎么...

  • 如何編程,編程有哪些

    如何編程,編程有哪些 相關圖片編程代碼干巴巴的意思是不要重復你自己。但事實上,這個名字有點無聊。哪種理論不是消除重復,而是如何消除重復的意義。一般來說,我認為drycss和OOCSS是兩個極端,所以算法編程...

關注微信

变脸官网查询