Source code
Revision control
Copy as Markdown
Other Tools
<!--
Copyright (c) 2019 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL Lots of polygons example.</title>
<link rel="stylesheet" href="../resources/js-test-style.css"/>
<script src="../js/js-test-pre.js"></script>
<script src="../js/webgl-test-utils.js"> </script>
<style>
html, body {
width: 100%;
height: 100%;
}
canvas {
border: 1px solid black;
width: 95%;
height: 80%;
}
</style
</head>
<body>
<canvas id="example"></canvas>
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";
window.onload = init;
debug("Tests a WebGL program that draws a bunch of large polygons from a quad mesh");
function init() {
if (confirm(
"After clicking OK your machine may become unresponsive or crash.")) {
main();
} else {
debug("cancelled");
}
}
function main() {
var wtu = WebGLTestUtils;
var canvas = document.getElementById("example");
var gridRes = 1000;
canvas.width = canvas.clientWidth;
canvas.heigt = canvas.clientHeight;
canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false);
canvas.addEventListener("webglcontextrestored", function(e) { }, false);
var gl = wtu.create3DContext(canvas);
var program = wtu.setupProgram(
gl, ['vshader', 'fshader'], ['vPosition'], [0]);
wtu.setupIndexedQuad(gl, gridRes, 0, true);
// make 1 texture since we'd have at least that in CSS shaders
var size = 256;
var pixels = new Uint8Array(size * size * 4);
for (var y = 0; y < size; ++y) {
for (var x = 0; x < size; ++x) {
var offset = (y * size + x) * 4;
pixels[offset + 0] = x * 255 / size;
pixels[offset + 1] = y * 255 / size;
pixels[offset + 2] = x * y * 255 / (size * size);
pixels[offset + 3] = 255;
}
}
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
// add test colors.
if (false) {
var vertsAcross = gridRes + 1;
var numQuads = vertsAcross * vertsAcross;
var colors = new Float32Array(numQuads * 4);
for (var ii = 0; ii < numQuads; ++ii) {
var offset = ii * 4;
colors[offset + 0] = Math.random();
colors[offset + 1] = Math.random();
colors[offset + 2] = Math.random();
colors[offset + 3] = 1;
}
var colorLocation = gl.getAttribLocation(program, "color")
var buf = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
gl.enableVertexAttribArray(colorLocation);
gl.vertexAttribPointer(colorLocation, 3, gl.FLOAT, false, 0, 0);
}
var gridResLoc = gl.getUniformLocation(program, "gridRes");
gl.uniform1f(gridResLoc, gridRes);
assertMsg(gl.getError() == gl.NO_ERROR, "Should be no errors from setup.");
gl.enable(gl.BLEND);
//gl.enable(gl.CULL_FACE);
//gl.cullFace(gl.FRONT);
gl.drawElements(gl.TRIANGLES, gridRes * gridRes * 6, gl.UNSIGNED_SHORT, 0);
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after drawing");
var successfullyParsed = true;
}
</script>
<script id="vshader" type="x-shader/x-vertex">
attribute vec4 vPosition;
varying vec2 v_texCoord;
uniform float gridRes;
#ifdef ADD_TEST_COLORS
attribute vec4 color;
varying vec4 v_color;
#endif
void main()
{
// expand each quad to cover the entire element.
vec2 p = mod((vPosition.xy * 0.5 + 0.5) * gridRes, 2.0) * 2.0 - 1.0;
gl_Position = vec4(p, 0, 1);
v_texCoord = vPosition.xy;
#ifdef ADD_TEST_COLORS
v_color = color;
#endif
}
</script>
<script id="fshader" type="x-shader/x-fragment">
precision mediump float;
varying vec4 v_color;
varying vec2 v_texCoord;
uniform sampler2D tex;
void main()
{
#ifdef ADD_TEST_COLORS
gl_FragColor = v_color;
#else
gl_FragColor = texture2D(tex, v_texCoord);
#endif
}
</script>
</body>
</html>