/
WebGL.ts
72 lines (62 loc) 路 2.04 KB
/
WebGL.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
let webGLAvailable: boolean, webGL2Available: boolean
export function isWebGLAvailable(): boolean {
if (webGLAvailable !== undefined) return webGLAvailable
try {
let gl
const canvas = document.createElement('canvas')
webGLAvailable = !!(window.WebGLRenderingContext && (gl = canvas.getContext('webgl')))
if (gl) gl.getExtension('WEBGL_lose_context')?.loseContext()
return webGLAvailable
} catch (e) {
return (webGLAvailable = false)
}
}
export function isWebGL2Available(): boolean {
if (webGL2Available !== undefined) return webGL2Available
try {
let gl
const canvas = document.createElement('canvas')
webGL2Available = !!(window.WebGL2RenderingContext && (gl = canvas.getContext('webgl2')))
if (gl) gl.getExtension('WEBGL_lose_context')?.loseContext()
return webGL2Available
} catch (e) {
return (webGL2Available = false)
}
}
export function getWebGLErrorMessage(): HTMLDivElement {
return getErrorMessage(1)
}
export function getWebGL2ErrorMessage(): HTMLDivElement {
return getErrorMessage(2)
}
export function getErrorMessage(version: 1 | 2): HTMLDivElement {
const names = {
1: 'WebGL',
2: 'WebGL 2',
}
const contexts = {
1: window.WebGLRenderingContext,
2: window.WebGL2RenderingContext,
}
const element = document.createElement('div')
element.id = 'webglmessage'
element.style.fontFamily = 'monospace'
element.style.fontSize = '13px'
element.style.fontWeight = 'normal'
element.style.textAlign = 'center'
element.style.background = '#fff'
element.style.color = '#000'
element.style.padding = '1.5em'
element.style.width = '400px'
element.style.margin = '5em auto 0'
let message =
'Your $0 does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">$1</a>'
if (contexts[version]) {
message = message.replace('$0', 'graphics card')
} else {
message = message.replace('$0', 'browser')
}
message = message.replace('$1', names[version])
element.innerHTML = message
return element
}