webgl指纹随机
// WebGLRenderingContext.prototype.bufferData _bufferData = WebGL2RenderingContext.prototype.bufferData; WebGL2RenderingContext.prototype.bufferData = function() { debugger;; let e = this; let t = arguments; let r = -1; if (t.length > 0 && (t[0].length ? r = 0 : t.length > 1 && t[1].length && (r = 1)), r >= 0) { let i = 0; for (let f = 0; f < 4; f++) { for (; i < t[r].length && t[r][i] === 0; i++) ; if (i > t[r].length) break; const d = t[r].constructor; let c = 0; if (d == Float32Array) c = (Math.random() * .05 + .1) * (Math.random() > .5 ? 1 : -1); else if (d == Int16Array || d == Int32Array || d == Uint16Array || d == Uint32Array) { const u = Math.min(...t[r]) , w = Math.max(...t[r]); c = Math.floor(Math.random() * (w - u + 1)) + u } t[r][i] += c, i++ } } _bufferData.apply(this, arguments) } let i = document.createElement("canvas"); i.width = 256; i.height = 128, i.style.backgroundColor = "#555", i.style.borderRadius = "4px"; var p = i.getContext('webgl2'); p.viewport(0, 0, p.drawingBufferWidth, p.drawingBufferHeight); var m = p.createProgram() , x = p.createShader(p.VERTEX_SHADER) , v = (p.shaderSource(x, "attribute vec2 attrVertex;attribute vec4 attrColor;varying vec4 varyinColor;uniform mat4 transform;void main(){varyinColor=attrColor;gl_Position=transform*vec4(attrVertex,0,1);}"), p.compileShader(x), p.attachShader(m, x), p.createShader(p.FRAGMENT_SHADER)) , b = (p.shaderSource(v, "precision mediump float;varying vec4 varyinColor;void main(){gl_FragColor=varyinColor;}"), p.compileShader(v), p.attachShader(m, v), p.linkProgram(m), p.useProgram(m), m.vertexPosAttrib = p.getAttribLocation(m, "attrVertex"), m.colorAttrib = p.getAttribLocation(m, "attrColor"), m.transform = p.getUniformLocation(m, "transform"), p.enableVertexAttribArray(m.vertexPosAttrib), p.enableVertexAttribArray(m.colorAttrib), p.uniformMatrix4fv(m.transform, !1, [1.5, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 1, 0, .5, 0, 0, 1]), []) , A = [-.25, 0] , S = 128; for (var C = 0; C < S; C++) { var L = (45 + C / S * 270) / 360 * 2 * Math.PI , R = (45 + (C + 1) / S * 270) / 360 * 2 * Math.PI; b.push(A[0], A[1], 1, .7, 0, 1), b.push(A[0] + .5 * Math.cos(L), A[1] + .5 * Math.sin(L), 2, 1 - C / S, 0, 1), b.push(A[0] + .5 * Math.cos(R), A[1] + .5 * Math.sin(R), 1, 1 - (C + 1) / S, 0, 1) } var T = new Float32Array(b) , w = p.createBuffer(); p.bindBuffer(p.ARRAY_BUFFER, w), p.bufferData(p.ARRAY_BUFFER, T, p.STATIC_DRAW), p.vertexAttribPointer(m.vertexPosAttrib, 2, p.FLOAT, !1, 24, 0), p.vertexAttribPointer(m.colorAttrib, 4, p.FLOAT, !1, 24, 8), p.drawArrays(p.LINE_STRIP, 0, T.length / 6); var M = new Uint8Array(p.canvas.width * p.canvas.height * 4) , y = (p.readPixels(0, 0, p.canvas.width, p.canvas.height, p.RGBA, p.UNSIGNED_BYTE, M), JSON.stringify(M).replace(/,?"[0-9]+":/g, "")); console.log(y); ;