doc_blended-geometry.html 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <!-- Any copyright is dedicated to the Public Domain.
  2. http://creativecommons.org/publicdomain/zero/1.0/ -->
  3. <!doctype html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8"/>
  7. <title>WebGL editor test page</title>
  8. <script id="shader-vs" type="x-shader/x-vertex">
  9. precision lowp float;
  10. attribute vec3 aVertexPosition;
  11. uniform float uDepth;
  12. void main(void) {
  13. gl_Position = vec4(aVertexPosition, uDepth);
  14. }
  15. </script>
  16. <script id="shader-fs-0" type="x-shader/x-fragment">
  17. precision lowp float;
  18. void main(void) {
  19. gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);
  20. }
  21. </script>
  22. <script id="shader-fs-1" type="x-shader/x-fragment">
  23. precision lowp float;
  24. void main(void) {
  25. gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
  26. }
  27. </script>
  28. </head>
  29. <body>
  30. <canvas id="canvas" width="128" height="128"></canvas>
  31. <script type="text/javascript;version=1.8">
  32. "use strict";
  33. let canvas, gl;
  34. let program = [];
  35. let squareVerticesPositionBuffer;
  36. let vertexPositionAttribute = [];
  37. let depthUniform = [];
  38. window.onload = function() {
  39. canvas = document.querySelector("canvas");
  40. gl = canvas.getContext("webgl", { preserveDrawingBuffer: true });
  41. gl.clearColor(0.0, 0.0, 0.0, 1.0);
  42. initProgram(0);
  43. initProgram(1);
  44. initBuffers();
  45. drawScene();
  46. }
  47. function initProgram(i) {
  48. let vertexShader = getShader("shader-vs");
  49. let fragmentShader = getShader("shader-fs-" + i);
  50. program[i] = gl.createProgram();
  51. gl.attachShader(program[i], vertexShader);
  52. gl.attachShader(program[i], fragmentShader);
  53. gl.linkProgram(program[i]);
  54. vertexPositionAttribute[i] = gl.getAttribLocation(program[i], "aVertexPosition");
  55. gl.enableVertexAttribArray(vertexPositionAttribute[i]);
  56. depthUniform[i] = gl.getUniformLocation(program[i], "uDepth");
  57. }
  58. function getShader(id) {
  59. let script = document.getElementById(id);
  60. let source = script.textContent;
  61. let shader;
  62. if (script.type == "x-shader/x-fragment") {
  63. shader = gl.createShader(gl.FRAGMENT_SHADER);
  64. } else if (script.type == "x-shader/x-vertex") {
  65. shader = gl.createShader(gl.VERTEX_SHADER);
  66. }
  67. gl.shaderSource(shader, source);
  68. gl.compileShader(shader);
  69. return shader;
  70. }
  71. function initBuffers() {
  72. squareVerticesPositionBuffer = gl.createBuffer();
  73. gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesPositionBuffer);
  74. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
  75. 1.0, 1.0, 0.0,
  76. -1.0, 1.0, 0.0,
  77. 1.0, -1.0, 0.0,
  78. -1.0, -1.0, 0.0
  79. ]), gl.STATIC_DRAW);
  80. }
  81. function drawScene() {
  82. gl.clear(gl.COLOR_BUFFER_BIT);
  83. for (let i = 0; i < 2; i++) {
  84. gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesPositionBuffer);
  85. gl.vertexAttribPointer(vertexPositionAttribute[i], 3, gl.FLOAT, false, 0, 0);
  86. gl.useProgram(program[i]);
  87. gl.uniform1f(depthUniform[i], i + 1);
  88. blend(i);
  89. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
  90. }
  91. window.requestAnimationFrame(drawScene);
  92. }
  93. function blend(i) {
  94. if (i == 0) {
  95. gl.disable(gl.BLEND);
  96. }
  97. else if (i == 1) {
  98. gl.enable(gl.BLEND);
  99. gl.blendColor(0.5, 0, 0, 0.25);
  100. gl.blendEquationSeparate(
  101. gl.FUNC_REVERSE_SUBTRACT, gl.FUNC_SUBTRACT);
  102. gl.blendFuncSeparate(
  103. gl.CONSTANT_COLOR, gl.ONE_MINUS_CONSTANT_COLOR,
  104. gl.ONE_MINUS_CONSTANT_COLOR, gl.CONSTANT_COLOR);
  105. }
  106. }
  107. </script>
  108. </body>
  109. </html>