context-hidden-alpha.html (4185B)
1 <!-- 2 Copyright (c) 2019 The Khronos Group Inc. 3 Use of this source code is governed by an MIT-style license that can be 4 found in the LICENSE.txt file. 5 --> 6 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <meta charset="utf-8"> 11 <link rel="stylesheet" href="../../resources/js-test-style.css"/> 12 <script src="../../js/js-test-pre.js"></script> 13 <script src="../../js/webgl-test-utils.js"></script> 14 <script id='vs' type='x-shader/x-vertex'> 15 attribute vec2 aPosCoord; 16 17 void main(void) { 18 gl_Position = vec4(aPosCoord, 0.0, 1.0); 19 } 20 </script> 21 22 <script id='fs' type='x-shader/x-fragment'> 23 precision mediump float; 24 25 void main(void) { 26 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 27 } 28 </script> 29 <script> 30 "use strict"; 31 32 var posCoords_arr = new Float32Array(2 * 4); 33 var posCoords_buff = null; 34 function DrawQuad(gl, prog, x0, y0, x1, y1) { 35 gl.useProgram(prog); 36 37 if (!posCoords_buff) { 38 posCoords_buff = gl.createBuffer(); 39 } 40 gl.bindBuffer(gl.ARRAY_BUFFER, posCoords_buff); 41 posCoords_arr[0] = x0; 42 posCoords_arr[1] = y0; 43 44 posCoords_arr[2] = x1; 45 posCoords_arr[3] = y0; 46 47 posCoords_arr[4] = x0; 48 posCoords_arr[5] = y1; 49 50 posCoords_arr[6] = x1; 51 posCoords_arr[7] = y1; 52 gl.bufferData(gl.ARRAY_BUFFER, posCoords_arr, gl.STREAM_DRAW); 53 54 gl.enableVertexAttribArray(prog.aPosCoord); 55 gl.vertexAttribPointer(prog.aPosCoord, 2, gl.FLOAT, false, 0, 0); 56 57 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); 58 } 59 60 function DrawSquare(gl, prog, size) { 61 DrawQuad(gl, prog, -size, -size, size, size); 62 } 63 64 function Reset(gl) { 65 gl.canvas.width += 1; 66 gl.canvas.width -= 1; 67 } 68 69 var iColor; 70 var pixel; 71 var dataURL_pre; 72 var dataURL_post; 73 74 function Test(gl, prog, shouldFinish) { 75 gl.enable(gl.BLEND); 76 gl.blendFunc(gl.ZERO, gl.DST_ALPHA); 77 78 iColor = 64; 79 var fColor = iColor / 255.0; 80 81 ////////////////// 82 83 debug('clear(R,G,B,0)'); 84 85 Reset(gl); 86 87 gl.clearColor(fColor, fColor, fColor, 0.0); 88 gl.clear(gl.COLOR_BUFFER_BIT); 89 90 dataURL_pre = gl.canvas.toDataURL(); 91 //console.log('Before blending: ' + dataURL_pre); 92 93 DrawSquare(gl, prog, 0.7); 94 95 WebGLTestUtils.checkCanvasRect(gl, gl.drawingBufferWidth/2, 96 gl.drawingBufferHeight/2, 1, 1, 97 [iColor, iColor, iColor, 255], 98 'Should blend as if alpha is 1.0.'); 99 100 dataURL_post = gl.canvas.toDataURL(); 101 //console.log('After blending: ' + dataURL_post); 102 shouldBe("dataURL_post", "dataURL_pre"); 103 104 ////////////////// 105 106 debug('mask(R,G,B,0), clear(R,G,B,1)'); 107 108 Reset(gl); 109 110 gl.colorMask(true, true, true, false); 111 gl.clearColor(fColor, fColor, fColor, 1.0); 112 gl.clear(gl.COLOR_BUFFER_BIT); 113 gl.colorMask(true, true, true, true); 114 115 dataURL_pre = gl.canvas.toDataURL(); 116 //console.log('Before blending: ' + dataURL_pre); 117 118 DrawSquare(gl, prog, 0.7); 119 120 WebGLTestUtils.checkCanvasRect(gl, gl.drawingBufferWidth/2, 121 gl.drawingBufferHeight/2, 1, 1, 122 [iColor, iColor, iColor, 255], 123 'Should blend as if alpha is 1.0.'); 124 125 dataURL_post = gl.canvas.toDataURL(); 126 //console.log('After blending: ' + dataURL_post); 127 shouldBe("dataURL_post", "dataURL_pre"); 128 129 //////////////// 130 131 WebGLTestUtils.glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); 132 133 if (shouldFinish) 134 finishTest(); 135 } 136 137 var gl; 138 function init() { 139 var canvas = document.getElementById('canvas'); 140 var attribs = { 141 alpha: false, 142 antialias: false, 143 premultipliedAlpha: false, 144 }; 145 gl = canvas.getContext('experimental-webgl', attribs); 146 shouldBeNonNull(gl); 147 shouldBe("gl.getParameter(gl.ALPHA_BITS)", "0"); 148 149 var prog = WebGLTestUtils.setupProgram(gl, ['vs', 'fs']); 150 shouldBeNonNull(prog); 151 prog.aPosCoord = gl.getAttribLocation(prog, 'aPosCoord'); 152 153 Test(gl, prog, false); 154 155 requestAnimationFrame(function(){ Test(gl, prog, true); }); 156 } 157 158 </script> 159 </head> 160 <body onload="init()"> 161 <canvas id='canvas'></canvas> 162 <br/> 163 <div id="description"></div> 164 <div id="console"></div> 165 </body> 166 </html>