应用程序开发公司
软件开发

针对您的项目需求及预算规划量身制定方案

个体/中小企业/集团/政府机构/行业组织 了解详情 了解详情

高性能渲染:小程序Canvas 2D与3D图形绘制

发布时间:2024-01-01 00:00 浏览次数:103

小程序沦为了移动互联网时代的关键产品之一,它可以在微信、支付宝等平台上运转,用户可以随心所欲地以获取至各类信息,展开各种操作方式。其中,小程序的图形技术就是非常关键的,同意了小程序若想通畅运转、展现可爱的界面。而其中一个非常应该高度关注的技术就是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绘制更加繁杂、高效率,适用于于绘制高级图形。开发者须要根据实际市场需求去挑选相同的绘制方法,达至更好的图形效果。

TAG标签:
阅读推荐