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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>WebGL ActiveTexture BindTexture conformance test.</title>
<script src="../../../resources/js-test.js"></script>
<script src="resources/webgl-test.js"> </script>
</head>
<body>
<canvas id="example" width="2" height="2" style="width: 40px; height: 40px;"></canvas>
<canvas id="canvas2d" width="1" height="1" style="width: 40px; height: 40px;"></canvas>
<div id="description"></div>
<div id="console"></div>
<script id="vshader" type="x-shader/x-vertex">
uniform mat4 world;
attribute vec3 vPosition;
attribute vec2 texCoord0;
varying vec2 texCoord;
void main()
{
gl_Position = world * vec4(vPosition, 1);
texCoord = texCoord0;
}
</script>
<script id="fshader" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D tex;
varying vec2 texCoord;
void main()
{
gl_FragColor = texture2D(tex, texCoord);
}
</script>
<script>
function init()
{
if (window.initNonKhronosFramework) {
window.initNonKhronosFramework(false);
}
debug("Tests that glActiveTexture and glBindTexture work as expected");
debug("Specifically texture targets are per active texture unit.");
debug("");
var canvas2d = document.getElementById("canvas2d");
var ctx2d = canvas2d.getContext("2d");
gl = initWebGL("example", "vshader", "fshader", [ "vPosition", "texCoord0"],
[ 0, 0, 0, 1 ], 1);
gl.disable(gl.DEPTH_TEST);
gl.disable(gl.BLEND);
var vertexObject = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
gl.bufferData(
gl.ARRAY_BUFFER,
new Float32Array([-1, 1,0, 1,1,0, -1,-1,0,
-1,-1,0, 1,1,0, 1,-1,0]),
gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
var vertexObject = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
gl.bufferData(
gl.ARRAY_BUFFER,
new Float32Array([ 0,0, 1,0, 0,1,
0,1, 1,0, 1,1]),
gl.STATIC_DRAW);
gl.enableVertexAttribArray(1);
gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
shouldBe("gl.getError()", "gl.NO_ERROR");
var colors = [
[0,192,128,255],
[128,64,255,255],
[192,255,64,255],
[200,0,255,255]];
// Make 4 textures by using 4 active texture units.
var textures = [];
for (var ii = 0; ii < colors.length; ++ii) {
var tex = gl.createTexture();
gl.activeTexture(gl.TEXTURE0 + ii);
gl.bindTexture(gl.TEXTURE_2D, tex);
textures[ii] = tex;
}
shouldBe("gl.getError()", "gl.NO_ERROR");
// now use each texture unit to write into the textures,
for (var ii = 0; ii < colors.length; ++ii) {
var c = colors[ii];
ctx2d.fillStyle =
"rgba(" + c[0] + "," + c[1] + "," + c[2] + "," + c[3] + ")";
ctx2d.fillRect(0, 0, 1, 1);
gl.activeTexture(gl.TEXTURE0 + ii);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas2d);
}
shouldBe("gl.getError()", "gl.NO_ERROR");
var textureLoc = gl.getUniformLocation(gl.program, "tex");
var worldLoc = gl.getUniformLocation(gl.program, "world");
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.clearColor(1,0,0,1);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
for (var ii = 0; ii < colors.length; ++ii) {
var x = ii % 2;
var y = Math.floor(ii / 2);
gl.uniform1i(textureLoc, ii);
gl.uniformMatrix4fv(
worldLoc, false,
[0.5, 0, 0, 0,
0, 0.5, 0, 0,
0, 0, 1, 0,
-0.5 + x, -0.5 + y, 0, 1]);
gl.drawArrays(gl.TRIANGLES, 0, 6);
}
shouldBe("gl.getError()", "gl.NO_ERROR");
for (var ii = 0; ii < colors.length; ++ii) {
var c = colors[ii];
var x = ii % 2;
var y = Math.floor(ii / 2);
var buf = new Uint8Array(4);
gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf);
var msg = 'expected:' +
c[0] + ', ' + c[1] + ', ' + c[2] + ', ' + c[3] + ' found: ' +
buf[0] + ', ' +
buf[1] + ', ' +
buf[2] + ', ' +
buf[3];
if (buf[0] != c[0] ||
buf[1] != c[1] ||
buf[2] != c[2] ||
buf[3] != c[3])
testFailed(msg);
else
testPassed(msg);
}
}
init();
</script>
</body>
</html>
|