123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- import {compareVersion} from '../../../../util/util'
- // WebGL
- const vs = `
- precision mediump float;
- attribute vec2 vertPosition;
- attribute vec3 vertColor;
- varying vec3 fragColor;
- void main() {
- gl_Position = vec4(vertPosition, 0.0, 1.0);
- fragColor = vertColor;
- }
- `
- const fs = `
- precision mediump float;
- varying vec3 fragColor;
- void main() {
- gl_FragColor = vec4(fragColor, 1.0);
- }
- `
- const triangleVertices = [
- 0.0, 0.5, 1.0, 1.0, 0.0,
- -0.5, -0.5, 0.7, 0.0, 1.0,
- 0.5, -0.5, 0.1, 1.0, 0.6
- ]
- Page({
- onShareAppMessage() {
- return {
- title: 'canvas',
- path: 'packageComponent/pages/canvas/webgl/webgl'
- }
- },
- data: {
- theme: 'light',
- canIUse: true,
- },
- onReady() {
- // 解决基础库小于 2.7.0 的兼容问题
- const {SDKVersion} = wx.getSystemInfoSync()
- if (compareVersion(SDKVersion, '2.7.0') < 0) {
- console.log('123')
- this.setData({
- canIUse: false,
- })
- } else {
- // WebGL
- wx.createSelectorQuery()
- .select('#canvasWebGL')
- .node()
- .exec((res) => {
- const canvas = res[0].node
- this.renderWebGL(canvas)
- })
- }
- },
- renderWebGL(canvas) {
- // 不支持webgl
- if (!canvas) {
- this.setData({
- canIUse: false,
- })
- return
- }
- const gl = canvas.getContext('webgl')
- if (!gl) {
- console.error('gl init failed', gl)
- return
- }
- gl.viewport(0, 0, 305, 305)
- const vertShader = gl.createShader(gl.VERTEX_SHADER)
- gl.shaderSource(vertShader, vs)
- gl.compileShader(vertShader)
- const fragShader = gl.createShader(gl.FRAGMENT_SHADER)
- gl.shaderSource(fragShader, fs)
- gl.compileShader(fragShader)
- const prog = gl.createProgram()
- gl.attachShader(prog, vertShader)
- gl.attachShader(prog, fragShader)
- gl.deleteShader(vertShader)
- gl.deleteShader(fragShader)
- gl.linkProgram(prog)
- gl.useProgram(prog)
- const draw = () => {
- const triangleVertexBufferObject = gl.createBuffer()
- gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexBufferObject)
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW)
- const positionAttribLocation = gl.getAttribLocation(prog, 'vertPosition')
- const colorAttribLocation = gl.getAttribLocation(prog, 'vertColor')
- gl.vertexAttribPointer(
- positionAttribLocation,
- 2,
- gl.FLOAT,
- gl.FALSE,
- 5 * Float32Array.BYTES_PER_ELEMENT,
- 0
- )
- gl.vertexAttribPointer(
- colorAttribLocation,
- 3,
- gl.FLOAT,
- gl.FALSE,
- 5 * Float32Array.BYTES_PER_ELEMENT,
- 2 * Float32Array.BYTES_PER_ELEMENT
- )
- gl.enableVertexAttribArray(positionAttribLocation)
- gl.enableVertexAttribArray(colorAttribLocation)
- gl.drawArrays(gl.TRIANGLES, 0, 3)
- canvas.requestAnimationFrame(draw)
- }
- canvas.requestAnimationFrame(draw)
- },
- onLoad() {
- this.setData({
- theme: wx.getSystemInfoSync().theme || 'light'
- })
- if (wx.onThemeChange) {
- wx.onThemeChange(({theme}) => {
- this.setData({theme})
- })
- }
- }
- })
|