webgl.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import {compareVersion} from '../../../../util/util'
  2. // WebGL
  3. const vs = `
  4. precision mediump float;
  5. attribute vec2 vertPosition;
  6. attribute vec3 vertColor;
  7. varying vec3 fragColor;
  8. void main() {
  9. gl_Position = vec4(vertPosition, 0.0, 1.0);
  10. fragColor = vertColor;
  11. }
  12. `
  13. const fs = `
  14. precision mediump float;
  15. varying vec3 fragColor;
  16. void main() {
  17. gl_FragColor = vec4(fragColor, 1.0);
  18. }
  19. `
  20. const triangleVertices = [
  21. 0.0, 0.5, 1.0, 1.0, 0.0,
  22. -0.5, -0.5, 0.7, 0.0, 1.0,
  23. 0.5, -0.5, 0.1, 1.0, 0.6
  24. ]
  25. Page({
  26. onShareAppMessage() {
  27. return {
  28. title: 'canvas',
  29. path: 'packageComponent/pages/canvas/webgl/webgl'
  30. }
  31. },
  32. data: {
  33. theme: 'light',
  34. canIUse: true,
  35. },
  36. onReady() {
  37. // 解决基础库小于 2.7.0 的兼容问题
  38. const {SDKVersion} = wx.getSystemInfoSync()
  39. if (compareVersion(SDKVersion, '2.7.0') < 0) {
  40. console.log('123')
  41. this.setData({
  42. canIUse: false,
  43. })
  44. } else {
  45. // WebGL
  46. wx.createSelectorQuery()
  47. .select('#canvasWebGL')
  48. .node()
  49. .exec((res) => {
  50. const canvas = res[0].node
  51. this.renderWebGL(canvas)
  52. })
  53. }
  54. },
  55. renderWebGL(canvas) {
  56. // 不支持webgl
  57. if (!canvas) {
  58. this.setData({
  59. canIUse: false,
  60. })
  61. return
  62. }
  63. const gl = canvas.getContext('webgl')
  64. if (!gl) {
  65. console.error('gl init failed', gl)
  66. return
  67. }
  68. gl.viewport(0, 0, 305, 305)
  69. const vertShader = gl.createShader(gl.VERTEX_SHADER)
  70. gl.shaderSource(vertShader, vs)
  71. gl.compileShader(vertShader)
  72. const fragShader = gl.createShader(gl.FRAGMENT_SHADER)
  73. gl.shaderSource(fragShader, fs)
  74. gl.compileShader(fragShader)
  75. const prog = gl.createProgram()
  76. gl.attachShader(prog, vertShader)
  77. gl.attachShader(prog, fragShader)
  78. gl.deleteShader(vertShader)
  79. gl.deleteShader(fragShader)
  80. gl.linkProgram(prog)
  81. gl.useProgram(prog)
  82. const draw = () => {
  83. const triangleVertexBufferObject = gl.createBuffer()
  84. gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexBufferObject)
  85. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW)
  86. const positionAttribLocation = gl.getAttribLocation(prog, 'vertPosition')
  87. const colorAttribLocation = gl.getAttribLocation(prog, 'vertColor')
  88. gl.vertexAttribPointer(
  89. positionAttribLocation,
  90. 2,
  91. gl.FLOAT,
  92. gl.FALSE,
  93. 5 * Float32Array.BYTES_PER_ELEMENT,
  94. 0
  95. )
  96. gl.vertexAttribPointer(
  97. colorAttribLocation,
  98. 3,
  99. gl.FLOAT,
  100. gl.FALSE,
  101. 5 * Float32Array.BYTES_PER_ELEMENT,
  102. 2 * Float32Array.BYTES_PER_ELEMENT
  103. )
  104. gl.enableVertexAttribArray(positionAttribLocation)
  105. gl.enableVertexAttribArray(colorAttribLocation)
  106. gl.drawArrays(gl.TRIANGLES, 0, 3)
  107. canvas.requestAnimationFrame(draw)
  108. }
  109. canvas.requestAnimationFrame(draw)
  110. },
  111. onLoad() {
  112. this.setData({
  113. theme: wx.getSystemInfoSync().theme || 'light'
  114. })
  115. if (wx.onThemeChange) {
  116. wx.onThemeChange(({theme}) => {
  117. this.setData({theme})
  118. })
  119. }
  120. }
  121. })