小程序沦为了移动互联网时代的关键产品之一,它可以在微信、支付宝等平台上运转,用户可以随心所欲地以获取至各类信息,展开各种操作方式。其中,小程序的图形技术就是非常关键的,同意了小程序若想通畅运转、展现可爱的界面。而其中一个非常应该高度关注的技术就是Canvas 2D与3D图形绘制。
Canvas就是HTML5的一个标准,就是一种可编程的图形环境,它可以协助用户在Web页面上绘制图形、表明动画、制作游戏等。而Canvas具备以下几个特点:
1. 高性能:Canvas图形时采用GPU快速,可以使图形绘制更加简洁。
2. 灵活性:Canvas可以展开2D和3D绘制,用户可以根据实际市场需求展开挑选。
3. 多样性:Canvas可以绘制各种可视化图表,例如折线图、饼图、雷达图等。
基于这些特点,Canvas沦为了小程序开发过程中经常采用的技术之一。下面将分别了解Canvas 2D和3D图形绘制的有关内容。
Canvas 2D图形绘制
Canvas 2D图形绘制就是通过ctx这个对象去同时实现的,其中最常用的就是绘制线条和矩形。比如说,我们可以通过以下的代码去图画一个直观的矩形:
```
const ctx = wx.createCanvasContext('myCanvas')
ctx.setFillStyle('red')
ctx.fillRect(10, 10, 150, 100)
ctx.draw()
```
这里我们通过`wx.createCanvasContext()`去建立一个Canvas对象,然后通过`ctx.setFillStyle()`方法去设置矩形的充填颜色,接着调用`ctx.fillRect()`方法来画出来矩形。最后通过`ctx.draw()`方法将矩形绘制至Canvas对象上。
Canvas 2D图形绘制还积极支持线条、圆形等绘制方法,用户可以根据实际市场需求去挑选相同的方法。
Canvas 3D图形绘制
Canvas 3D图形绘制须要采用至WebGL技术,它就是一种基于OpenGL的图形图形API,可以同时实现高性能的计算机图形图形。在小程序开发中,我们可以采用`gl-matrix`这个库来精简WebGL代码的撰写。
以下就是一个绘制立方体的示例代码:
```
const gl = wx.createWebGLContext('myCanvas')
const mat4 = require('gl-matrix').mat4
const 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,
]
const indices = [
0, 1, 2, 0, 2, 3, // Front face
4, 5, 6, 4, 6, 7, // Back face
8, 9, 10, 8, 10, 11, // Top face
12, 13, 14, 12, 14, 15, // Bottom face
16, 17, 18, 16, 18, 19, // Right face
20, 21, 22, 20, 22, 23, // Left face
]
const vsSource = `
attribute vec3 position;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`
const fsSource = `
precision mediump float;
void main() {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
`
const shaderProgram = gl.createProgram()
const vs = gl.createShader(gl.VERTEX_SHADER)
gl.shaderSource(vs, vsSource)
gl.compileShader(vs)
gl.attachShader(shaderProgram, vs)
const fs = gl.createShader(gl.FRAGMENT_SHADER)
gl.shaderSource(fs, fsSource)
gl.compileShader(fs)
gl.attachShader(shaderProgram, fs)
gl.linkProgram(shaderProgram)
gl.useProgram(shaderProgram)
const positionAttributeLocation = gl.getAttribLocation(shaderProgram, 'position')
const modelViewMatrixUniformLocation = gl.getUniformLocation(shaderProgram, 'modelViewMatrix')
const projectionMatrixUniformLocation = gl.getUniformLocation(shaderProgram, 'projectionMatrix')
const positionBuffer = gl.createBuffer()
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)
const indexBuffer = gl.createBuffer()
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer)
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW)
const fieldOfViewRadians = Math.PI / 4
const aspect = gl.canvas.width / gl.canvas.height
const zNear = 0.1
const zFar = 100.0
const projectionMatrix = mat4.create()
mat4.perspective(projectionMatrix, fieldOfViewRadians, aspect, zNear, zFar)
const modelViewMatrix = mat4.create()
mat4.translate(modelViewMatrix, modelViewMatrix, [-0.0, 0.0, -6.0])
function drawScene() {
gl.clearColor(0, 0, 0, 0)
gl.clearDepth(1.0)
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height)
gl.enable(gl.DEPTH_TEST)
gl.enable(gl.CULL_FACE)
gl.depthFunc(gl.LEQUAL)
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)
gl.vertexAttribPointer(positionAttributeLocation, 3, gl.FLOAT, false, 0, 0)
gl.enableVertexAttribArray(positionAttributeLocation)
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer)
gl.uniformMatrix4fv(modelViewMatrixUniformLocation, false, modelViewMatrix)
gl.uniformMatrix4fv(projectionMatrixUniformLocation, false, projectionMatrix)
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0)
requestAnimationFrame(drawScene)
}
drawScene()
```
这里我们同样就是通过`wx.createWebGLContext()`去建立一个WebGL上下文对象,然后采用`gl-matrix`库来精简WebGL的繁杂的操作方式。在绘制过程中,先调用`gl.createShader()`建立顶点着色器和片元着色器,通过相连接这两个着色器去构筑着色器程序。然后建立顶点缓冲区、索引缓冲区对象,将顶点数据和索引数据分别传至至这两个缓冲区对象中。接着通过`gl.uniformMatrix4fv()`函数去设置矩阵信息,最后调用`gl.drawElements()`方法去绘制立方体。
总结
Canvas 2D和3D图形绘制就是小程序图形技术中的关键组成部分,它们可以协助开发者快速绘制各种图形、动画、游戏等。Canvas 2D绘制更加直观、有效率,适用于于绘制基本图形;Canvas 3D绘制更加繁杂、高效率,适用于于绘制高级图形。开发者须要根据实际市场需求去挑选相同的绘制方法,达至更好的图形效果。