shader-with-array-of-structs-containing-arrays.html (4352B)
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 <title>GLSL Array of Structs Containing Arrays</title> 12 <link rel="stylesheet" href="../../../resources/js-test-style.css"/> 13 <link rel="stylesheet" href="../../../resources/glsl-feature-tests.css"/> 14 <script src="../../../js/js-test-pre.js"></script> 15 <script src="../../../js/webgl-test-utils.js"> </script> 16 17 <script id="vshader" type="x-shader/x-vertex"> 18 attribute vec4 a_position; 19 void main(void) { 20 gl_Position = a_position; 21 } 22 </script> 23 <script id="fshader0" type="x-shader/x-fragment"> 24 precision mediump float; 25 struct my_struct { 26 vec4 color[2]; 27 }; 28 uniform my_struct u_colors[2]; 29 void main(void) { 30 gl_FragColor = u_colors[0].color[0]; 31 } 32 </script> 33 <script id="fshader1" type="x-shader/x-fragment"> 34 precision mediump float; 35 struct my_struct { 36 vec4 color[2]; 37 }; 38 uniform my_struct u_colors[2]; 39 void main(void) { 40 gl_FragColor = u_colors[0].color[1]; 41 } 42 </script> 43 <script id="fshader-with-one-element-arrays" type="x-shader/x-fragment"> 44 precision mediump float; 45 struct my_struct { 46 vec4 color[1]; 47 }; 48 uniform my_struct u_colors[1]; 49 void main(void) { 50 gl_FragColor = u_colors[0].color[0]; 51 } 52 </script> 53 <script id="fshader3" type="x-shader/x-fragment"> 54 precision mediump float; 55 struct my_struct { 56 vec4 color1[2]; 57 vec4 color2[2]; 58 }; 59 uniform my_struct u_colors[2]; 60 void main(void) { 61 gl_FragColor = u_colors[0].color1[0] + u_colors[0].color2[0] + u_colors[1].color1[1] +u_colors[1].color2[1]; 62 } 63 </script> 64 </head> 65 <body> 66 <canvas id="canvas" width="50" height="50"></canvas> 67 <div id="description"></div> 68 <div id="console"></div> 69 <script> 70 "use strict"; 71 description(); 72 73 var wtu = WebGLTestUtils; 74 var gl = wtu.create3DContext("canvas"); 75 wtu.setupUnitQuad(gl); 76 77 for (var ii = 0; ii < 2; ++ii) { 78 var program = wtu.setupProgram(gl, ["vshader", "fshader" + ii], ["a_position"]); 79 var red_loc = gl.getUniformLocation(program, "u_colors[0].color[" + ii + "]"); 80 var green_loc = gl.getUniformLocation(program, "u_colors[0].color[" + (1 - ii) + "]"); 81 gl.uniform4fv(red_loc, [1, 0, 0, 1]); 82 gl.uniform4fv(green_loc, [0, 1, 0, 1]); 83 wtu.clearAndDrawUnitQuad(gl); 84 wtu.checkCanvas(gl, [255, 0, 0, 255], "Should be red"); 85 } 86 87 var program = wtu.setupProgram(gl, ["vshader", "fshader-with-one-element-arrays"], ["a_position"]); 88 var green_loc = gl.getUniformLocation(program, "u_colors[0].color[0]"); 89 gl.uniform4fv(green_loc, [0, 1, 0, 1]); 90 wtu.clearAndDrawUnitQuad(gl); 91 wtu.checkCanvas(gl, [0, 255, 0, 255], "Should be green"); 92 93 var program = wtu.setupProgram(gl, ["vshader", "fshader3"], ["a_position"]); 94 var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); 95 shouldBe("numUniforms", "4"); 96 var uniforms = [] 97 for (var ii = 0; ii < numUniforms; ++ii) { 98 uniforms.push(gl.getActiveUniform(program, ii).name); 99 } 100 uniforms.sort(); 101 shouldBe("uniforms[0]", '"u_colors[0].color1[0]"'); 102 shouldBe("uniforms[1]", '"u_colors[0].color2[0]"'); 103 shouldBe("uniforms[2]", '"u_colors[1].color1[0]"'); 104 shouldBe("uniforms[3]", '"u_colors[1].color2[0]"'); 105 var loc00 = gl.getUniformLocation(program, "u_colors[0].color1"); 106 var loc01 = gl.getUniformLocation(program, "u_colors[0].color2"); 107 var loc10 = gl.getUniformLocation(program, "u_colors[1].color1"); 108 var loc11 = gl.getUniformLocation(program, "u_colors[1].color2"); 109 shouldBeTrue("loc00 != undefined"); 110 shouldBeTrue("loc01 != undefined"); 111 shouldBeTrue("loc10 != undefined"); 112 shouldBeTrue("loc11 != undefined"); 113 gl.uniform4fv(loc00, [1, 0, 0, 0]); 114 gl.uniform4fv(loc01, [0, 1, 0, 0]); 115 gl.uniform4fv(loc10, [0, 0, 0, 0, 0, 0, 1, 0]); 116 gl.uniform4fv(loc11, [0, 0, 0, 0, 0, 0, 0, 1]); 117 var loc101 = gl.getUniformLocation(program, "u_colors[1].color1[1]"); 118 var loc111 = gl.getUniformLocation(program, "u_colors[1].color2[1]"); 119 shouldBeTrue("loc101 != undefined"); 120 shouldBeTrue("loc111 != undefined"); 121 wtu.clearAndDrawUnitQuad(gl, [0, 0, 0, 0]); 122 gl.uniform4fv(loc101, [0, 0, 0, 0]); 123 gl.uniform4fv(loc111, [0, 0, 0, 0]); 124 wtu.clearAndDrawUnitQuad(gl, [0, 0, 0, 0]); 125 wtu.checkCanvas(gl, [255, 255, 0, 0], "Should be yellow"); 126 127 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 128 129 var successfullyParsed = true; 130 </script> 131 <script src="../../../js/js-test-post.js"></script> 132 </body> 133 </html>