canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) 是什么意思?

在学习webgl的时候,看到别人的example里面有这样的代码:

canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) 是什么意思?为什么这样写?

原来是因为:

早期WebGL的context,还不能通过正式的名称webgl来获取,必须使用experimental-webgl来获取context对象。
但是,随着技术的发展更新,后来就可以通过正式的名称来获取context,所以,在获取context对象的时候,一些比较旧的代码使用或运算(||)来按照名称的顺序来执行。

var gl = c.getContext('webgl') || c.getContext('experimental-webgl');

如果浏览器支持webgl的话,这个时候gl就是你获取到的WebGL的context,接下来就通过gl来操作WebGL。

 

关于getContext方法的用法参见笔者博客https://blog.youkuaiyun.com/acoolgiser/article/details/85800799

// 生成Canvas指纹 function generateCanvasHash() { try { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // 绘制复杂图形增加熵值 ctx.fillStyle = 'rgb(128, 0, 128)'; ctx.fillRect(0, 0, 200, 50); ctx.font = '24px "Arial"'; ctx.fillStyle = 'rgba(255, 255, 0, 0.7)'; ctx.fillText('Fingerprint', 10, 30); // 添加几何图形和渐变 ctx.strokeStyle = 'rgb(0, 255, 255)'; ctx.beginPath(); ctx.arc(150, 25, 20, 0, 2 * Math.PI); ctx.stroke(); // 获取图像数据并生成哈希 return hashData(ctx.getImageData(0, 0, 200, 50).data); } catch (e) { return 'canvas_error:' + e.message; } } // 生成Audio指纹 function generateAudioHash() { try { const context = new (window.AudioContext || window.webkitAudioContext)(); const oscillator = context.createOscillator(); const analyser = context.createAnalyser(); oscillator.connect(analyser); analyser.connect(context.destination); oscillator.type = 'sine'; oscillator.frequency.value = 1000; // 分析频率数据 const dataArray = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(dataArray); return hashData(dataArray); } catch (e) { return 'audio_error:' + e.message; } } // 生成WebGL指纹 function generateWebGLHash() { try { const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); if (!gl) return 'webgl_not_supported'; // 获取渲染器信息 const debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); const renderer = debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : gl.getParameter(gl.VERSION); return hashData(renderer); } catch (e) { return 'webgl_error:' + e.message; } } // 通用哈希函数 function hashData(data) { const str = typeof data === 'string' ? data : Array.from(data).join(''); let hash = 0; for (let i = 0; i < str.length; i++) { hash = (hash << 5) - hash + str.charCodeAt(i); hash |= 0; // 转换为32位整数 } return 'fp_' + Math.abs(hash).toString(36); } // 获取完整设备指纹 const getDeviceFingerprint = () => ({ userAgent: navigator.userAgent, screen: `${screen.width}x${screen.height}`, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, languages: navigator.languages.join(','), hardwareConcurrency: navigator.hardwareConcurrency, deviceMemory: navigator.deviceMemory, canvasHash: generateCanvasHash(), audioHash: generateAudioHash(), webGLHash: generateWebGLHash(), timestamp: Date.now() }); // 发送到服务器 fetch('https://your-server.com/collect', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(getDeviceFingerprint()) });
最新发布
08-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值