-
Notifications
You must be signed in to change notification settings - Fork 142
/
Copy pathdraw_image_space.html
104 lines (82 loc) · 3.44 KB
/
draw_image_space.html
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<!DOCTYPE html>
<!-- Ported from the OpenGL Samples Pack https://github.com/g-truc/ogl-samples/blob/master/tests/gl-320-draw-image-space.cpp -->
<html lang="en">
<head>
<title>WebGL 2 Samples - draw_image_space</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="info">WebGL 2 Samples - draw_image_space</div>
<!-- WebGL 2 shaders -->
<script id="vs" type="x-shader/x-vertex">
#version 300 es
precision highp float;
precision highp int;
void main()
{
gl_Position = vec4(2.f * float(uint(gl_VertexID) % 2u) - 1.f, 2.f * float(uint(gl_VertexID) / 2u) - 1.f, 0.0, 1.0);
}
</script>
<script id="fs" type="x-shader/x-fragment">
#version 300 es
precision highp float;
precision highp int;
uniform sampler2D diffuse;
uniform vec2 u_imageSize;
out vec4 color;
void main()
{
color = texture(diffuse, vec2(gl_FragCoord.x, u_imageSize.y - gl_FragCoord.y) / u_imageSize);
}
</script>
<script src="utility.js"></script>
<script>
(function () {
'use strict';
var canvas = document.createElement('canvas');
canvas.width = Math.min(window.innerWidth, window.innerHeight);
canvas.height = canvas.width;
document.body.appendChild(canvas);
var gl = canvas.getContext( 'webgl2', { antialias: false } );
var isWebGL2 = !!gl;
if(!isWebGL2) {
document.getElementById('info').innerHTML = 'WebGL 2 is not available. See <a href="https://www.khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">How to get a WebGL 2 implementation</a>';
return;
}
// -- Init program
var program = createProgram(gl, getShaderSource('vs'), getShaderSource('fs'));
var diffuseLocation = gl.getUniformLocation(program, 'diffuse');
var imageSizeLocation = gl.getUniformLocation(program, 'u_imageSize');
// -- Init VertexArray
var vertexArray = gl.createVertexArray();
gl.bindVertexArray(vertexArray);
gl.bindVertexArray(null);
loadImage('../assets/img/Di-3d.png', function(image) {
// -- Init Texture
var texture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
// -- Render
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(program);
gl.uniform1i(diffuseLocation, 0);
gl.uniform2f(imageSizeLocation, canvas.width / 2, canvas.height / 2);
gl.bindVertexArray(vertexArray);
gl.drawArrays(gl.TRIANGLES, 0, 3);
// Delete WebGL resources
gl.deleteTexture(texture);
gl.deleteProgram(program);
gl.deleteVertexArray(vertexArray);
});
})();
</script>
<div id="highlightedLines" style="display: none">#L23</div>
</body>
</html>