From 1140e54ccfc9e828ffe62f9384c91dcd9dcfe8cf Mon Sep 17 00:00:00 2001 From: greggman Date: Wed, 15 Jan 2025 04:50:34 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=20ca702?= =?UTF-8?q?ba92756f5a1fc25785a24dcd61bf8a42533=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atom.xml | 602 +++++++++--------- contributors.js | 2 +- webgl/lessons/atom.xml | 602 +++++++++--------- webgl/lessons/de/atom.xml | 10 +- webgl/lessons/ja/atom.xml | 38 +- webgl/lessons/ja/webgl-how-it-works.html | 45 +- webgl/lessons/ja/webgl1-to-webgl2.html | 81 +-- webgl/lessons/ko/atom.xml | 250 ++++---- webgl/lessons/ko/webgl-2d-drawimage.html | 19 +- webgl/lessons/ko/webgl-2d-vs-3d-library.html | 30 +- webgl/lessons/ko/webgl-3d-orthographic.html | 29 +- webgl/lessons/ko/webgl-how-it-works.html | 45 +- .../lessons/ko/webgl-less-code-more-fun.html | 64 +- .../ko/webgl-planar-projection-mapping.html | 41 +- webgl/lessons/ko/webgl1-to-webgl2.html | 87 +-- webgl/lessons/pt-br/atom.xml | 74 +-- .../lessons/pt-br/webgl-2d-vs-3d-library.html | 30 +- webgl/lessons/pt-br/webgl1-to-webgl2.html | 61 +- webgl/lessons/webgl-2d-drawimage.html | 19 +- webgl/lessons/webgl-2d-vs-3d-library.html | 30 +- webgl/lessons/webgl-less-code-more-fun.html | 64 +- webgl/lessons/webgl-load-obj-w-mtl.html | 15 +- .../webgl-planar-projection-mapping.html | 41 +- webgl/lessons/webgl1-to-webgl2.html | 81 +-- webgl/lessons/zh_cn/atom.xml | 222 +++---- webgl/lessons/zh_cn/webgl-2d-drawimage.html | 20 +- .../zh_cn/webgl-3d-geometry-lathe.html | 40 +- .../lessons/zh_cn/webgl-3d-orthographic.html | 26 +- webgl/lessons/zh_cn/webgl-how-it-works.html | 28 +- .../zh_cn/webgl-less-code-more-fun.html | 56 +- webgl/lessons/zh_cn/webgl-load-obj-w-mtl.html | 11 +- .../webgl-planar-projection-mapping.html | 22 +- webgl/lessons/zh_cn/webgl1-to-webgl2.html | 81 +-- 33 files changed, 1453 insertions(+), 1413 deletions(-) diff --git a/atom.xml b/atom.xml index 53d9d479..316ac38d 100644 --- a/atom.xml +++ b/atom.xml @@ -2,7 +2,7 @@ WebGL2 Fundamentals - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z https://github.com/jpmonette/feed WebGL2Fundamentals Contributors @@ -15,1650 +15,1650 @@ <![CDATA[WebGL2 Using 2 or More Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2-textures.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Implementing DrawImage]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-drawimage.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Matrices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-matrices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Implementing A Matrix Stack]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-matrix-stack.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Rotation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-rotation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Scale]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-scale.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Translation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-translation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Rasterization vs 3D libraries]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-vs-3d-library.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Cameras]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-camera.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D Geometry - Lathe]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-geometry-lathe.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Directional Lighting]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-directional.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Normal Mapping]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-normal-mapping.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Point Lighting]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-point.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Spot Lighting]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-spot.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Orthographic 3D]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-orthographic.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D Perspective Correct Texture Mapping]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-perspective-correct-texturemapping.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D Perspective]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-perspective.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-textures.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 and Alpha]]> https://webgl2fundamentals.org/webgl/lessons/webgl-and-alpha.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Animation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-animation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Anti-Patterns]]> https://webgl2fundamentals.org/webgl/lessons/webgl-anti-patterns.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Attributes]]> https://webgl2fundamentals.org/webgl/lessons/webgl-attributes.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Boilerplate]]> https://webgl2fundamentals.org/webgl/lessons/webgl-boilerplate.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Cross Origin Images]]> https://webgl2fundamentals.org/webgl/lessons/webgl-cors-permission.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Cross Platform Issues]]> https://webgl2fundamentals.org/webgl/lessons/webgl-cross-platform-issues.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Cubemaps]]> https://webgl2fundamentals.org/webgl/lessons/webgl-cube-maps.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Data Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-data-textures.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Drawing Multiple Things]]> https://webgl2fundamentals.org/webgl/lessons/webgl-drawing-multiple-things.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Drawing Without Data]]> https://webgl2fundamentals.org/webgl/lessons/webgl-drawing-without-data.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Environment Maps (reflections)]]> https://webgl2fundamentals.org/webgl/lessons/webgl-environment-maps.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Fog]]> https://webgl2fundamentals.org/webgl/lessons/webgl-fog.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Framebuffers]]> https://webgl2fundamentals.org/webgl/lessons/webgl-framebuffers.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Fundamentals]]> https://webgl2fundamentals.org/webgl/lessons/webgl-fundamentals.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use WebGL2]]> https://webgl2fundamentals.org/webgl/lessons/webgl-getting-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 GPGPU]]> https://webgl2fundamentals.org/webgl/lessons/webgl-gpgpu.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 How It Works]]> https://webgl2fundamentals.org/webgl/lessons/webgl-how-it-works.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Image Processing Continued]]> https://webgl2fundamentals.org/webgl/lessons/webgl-image-processing-continued.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Image Processing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-image-processing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Indexed Vertices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-indexed-vertices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Optimization - Instanced Drawing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-instanced-drawing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Less Code, More Fun]]> https://webgl2fundamentals.org/webgl/lessons/webgl-less-code-more-fun.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Load Obj with Mtl]]> https://webgl2fundamentals.org/webgl/lessons/webgl-load-obj-w-mtl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Load Obj]]> https://webgl2fundamentals.org/webgl/lessons/webgl-load-obj.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Matrix Naming]]> https://webgl2fundamentals.org/webgl/lessons/webgl-matrix-naming.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Matrices vs Math Matrices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-matrix-vs-math.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Multiple Views, Multiple Canvases]]> https://webgl2fundamentals.org/webgl/lessons/webgl-multiple-views.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Picking]]> https://webgl2fundamentals.org/webgl/lessons/webgl-picking.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Planar and Perspective Projection Mapping]]> https://webgl2fundamentals.org/webgl/lessons/webgl-planar-projection-mapping.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Points, Lines, and Triangles]]> https://webgl2fundamentals.org/webgl/lessons/webgl-points-lines-triangles.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Precision Issues]]> https://webgl2fundamentals.org/webgl/lessons/webgl-precision-issues.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Pulling Vertices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-pulling-vertices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[A simple way to show the load on the GPU's vertex and fragment processing?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-a-simple-way-to-show-the-load-on-the-gpu-s-vertex-and-fragment-processing-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Accessing textures by pixel coordinate in WebGL2]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-accessing-textures-by-pixel-coordinate-in-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Apply a displacement map and specular map]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-apply-a-displacement-map-and-specular-map.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Can anyone explain what this GLSL fragment shader is doing?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-can-anyone-explain-what-this-glsl-fragment-shader-is-doing-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Can I mute the warning about vertex attrib 0 being disabled?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-can-i-mute-the-warning-about-vertex-attrib-0-being-disabled-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Create image warping effect in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-create-image-warping-effect-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Creating a smudge/liquify effect]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-creating-a-smudge-liquify-effect.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Determine min/max values for the entire image]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-determine-min-max-values-for-the-entire-image.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Don't blend a polygon that crosses itself]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-don-t-blend-a-polygon-that-crosses-itself.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing 2D image with depth map to achieve pseudo-3D effect]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-2d-image-with-depth-map-to-achieve-pseudo-3d-effect.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing a heightmap]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-a-heightmap.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing layers with different points]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-layers-with-different-points.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing Many different models in a single draw call]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-many-different-models-in-a-single-draw-call.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing textured sprites with instanced drawing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-textured-sprites-with-instanced-drawing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Efficient particle system in javascript? (WebGL)]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-efficient-particle-system-in-javascript---webgl-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Emulating palette based graphics in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-emulating-palette-based-graphics-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[FPS-like camera movement with basic matrix transformations]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-fps-like-camera-movement-with-basic-matrix-transformations.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Get the size of a point for collision checking]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-get-the-size-of-a-point-for-collision-checking.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[GLSL shader to support coloring and texturing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-glsl-shader-to-support-coloring-and-texturing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I compute for 500 points which of 1000 line segments is nearest to each point?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-compute-for-500-points-which-of-1000-line-segments-is-nearest-to-each-point-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I create a 16bit historgram of 16bit data]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-create-a-16bit-historgram-of-16bit-data.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I get all the uniforms and uniformBlocks]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-get-all-the-uniforms-and-uniformblocks.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I move the perspective vanishing point from the center of the canvas?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-move-the-perspective-vanishing-point-from-the-center-of-the-canvas-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to Achieve Moving Line with Trail Effects]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-achieve-moving-line-with-trail-effects.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to bind an array of textures to a WebGL shader uniform?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-bind-an-array-of-textures-to-a-webgl-shader-uniform-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to blend colors across 2 triangles]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-blend-colors-across-2-triangles.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to control the color between vertices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-control-the-color-between-vertices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to create a torus]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-create-a-torus.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to detect clipped triangles in the framgment shader]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-detect-clipped-triangles-in-the-framgment-shader.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to determine the average brightness in a scene?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-determine-the-average-brightness-in-a-scene-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to draw correctly textured trapezoid polygons]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-draw-correctly-textured-trapezoid-polygons.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to fade the drawing buffer]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-fade-the-drawing-buffer.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get audio data into a shader]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-audio-data-into-a-shader.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:30.595Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get code completion for WebGL in Visual Studio Code]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-code-completion-for-webgl-in-visual-studio-code.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get pixelize effect in webgl?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-pixelize-effect-in-webgl-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get the 3d coordinates of a mouse click]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-the-3d-coordinates-of-a-mouse-click.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to implement zoom from mouse in 2D WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-implement-zoom-from-mouse-in-2d-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to import a heightmap in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-import-a-heightmap-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to load images in the background with no jank]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-load-images-in-the-background-with-no-jank.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to make a smudge brush tool]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-make-a-smudge-brush-tool.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to make WebGL canvas transparent]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-make-webgl-canvas-transparent.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to optimize rendering a UI]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-optimize-rendering-a-ui.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to prevent texture bleeding with a texture atlas]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-prevent-texture-bleeding-with-a-texture-atlas.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to process particle positions]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-process-particle-positions.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to read a single component with readPixels]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-read-a-single-component-with-readpixels.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to render large scale images like 32000x32000]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-render-large-scale-images-like-32000x32000.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to simulate a 3D texture in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-simulate-a-3d-texture-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to support both WebGL and WebGL2]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-support-both-webgl-and-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to tell if an image has an alpha channel]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-tell-if-an-image-has-an-alpha-channel.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use a 2d sprite's transparency as a mask]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-a-2d-sprite-s-transparency-as-a-mask.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use texture, and color also in WebGL?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-texture--and-color-also-in-webgl-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use textures as data]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-textures-as-data.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use the stencil buffer]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-the-stencil-buffer.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to write a web-based music visualizer]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-write-a-web-based-music-visualizer.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[I get invalid type error when calling readPixels]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-i-get-invalid-type-error-when-calling-readpixels.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Is it possible to measure rendering time in webgl using gl.finish()?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-is-it-possible-to-measure-rendering-time-in-webgl-using-gl-finish---.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Is there the notion of a generalized vertex and fragment shader?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-is-there-the-notion-of-a-generalized-vertex-and-fragment-shader-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Optimize drawing lots of large images]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-optimize-drawing-lots-of-large-images.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Passing in per sprite alpha values when batching]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-passing-in-per-sprite-alpha-values-when-batching.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Pure WebGL Dashed Line]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-pure-webgl-dashed-line.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Recording FPS in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-recording-fps-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Rendering slowly over time]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-rendering-slowly-over-time.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Setting the values of a struct array from JS to GLSL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-setting-the-values-of-a-struct-array-from-js-to-glsl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Show a night view vs a day view on a 3D Earth sphere]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-show-a-night-view-vs-a-day-view-on-a-3d-earth-sphere.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Sorting and optimizing instanced rendering]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-sorting-and-optimizing-instanced-rendering.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Tex image TEXTURE_2D level 0 is incurring lazy initialization]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-tex-image-texture_2d-level-0-is-incurring-lazy-initialization.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[The fastest way to draw many circles]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-the-fastest-way-to-draw-many-circles.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL 2D tilemaps]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-webgl-2d-tilemaps.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL Droste effect]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-webgl-droste-effect.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[What is the local origin of a 3D model?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-what-is-the-local-origin-of-a-3d-model-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[When to choose highp, mediump, lowp in shaders]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-when-to-choose-highp--mediump--lowp-in-shaders.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Working around gl_PointSize limitations webGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-working-around-gl_pointsize-limitations-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Zooming to and stopping at object in a scene in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-zooming-to-and-stopping-at-object-in-a-scene-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Questions and Answers]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 readPixels]]> https://webgl2fundamentals.org/webgl/lessons/webgl-readpixels.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[References]]> https://webgl2fundamentals.org/webgl/lessons/webgl-references.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Rendering to a Texture]]> https://webgl2fundamentals.org/webgl/lessons/webgl-render-to-texture.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Resizing the Canvas.]]> https://webgl2fundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Scene Graph]]> https://webgl2fundamentals.org/webgl/lessons/webgl-scene-graph.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Setup and Installation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-setup-and-installation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shaders and GLSL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shaders-and-glsl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shadertoy]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shadertoy.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shadows Continued]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shadows-continued.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shadows]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shadows.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Skinning]]> https://webgl2fundamentals.org/webgl/lessons/webgl-skinning.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 SkyBox]]> https://webgl2fundamentals.org/webgl/lessons/webgl-skybox.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Smallest Programs]]> https://webgl2fundamentals.org/webgl/lessons/webgl-smallest-programs.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Sprites]]> https://webgl2fundamentals.org/webgl/lessons/webgl-sprites.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 State Diagram]]> https://webgl2fundamentals.org/webgl/lessons/webgl-state-diagram.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - Canvas 2D]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-canvas2d.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - Using a Glyph Texture]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-glyphs.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - HTML]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-html.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-texture.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Texture Units]]> https://webgl2fundamentals.org/webgl/lessons/webgl-texture-units.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Tips]]> https://webgl2fundamentals.org/webgl/lessons/webgl-tips.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Visualizing the Camera]]> https://webgl2fundamentals.org/webgl/lessons/webgl-visualizing-the-camera.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Differences from WebGLFundamentals.org]]> https://webgl2fundamentals.org/webgl/lessons/webgl1-to-webgl2-fundamentals.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 from WebGL1]]> https://webgl2fundamentals.org/webgl/lessons/webgl1-to-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 What's New]]> https://webgl2fundamentals.org/webgl/lessons/webgl2-whats-new.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z \ No newline at end of file diff --git a/contributors.js b/contributors.js index 1fda43ce..a9877c1d 100644 --- a/contributors.js +++ b/contributors.js @@ -1,2 +1,2 @@ -const contributors = [{"login":"greggman","id":234804,"node_id":"MDQ6VXNlcjIzNDgwNA==","avatar_url":"https://avatars.githubusercontent.com/u/234804?v=4","gravatar_id":"","url":"https://api.github.com/users/greggman","html_url":"https://github.com/greggman","followers_url":"https://api.github.com/users/greggman/followers","following_url":"https://api.github.com/users/greggman/following{/other_user}","gists_url":"https://api.github.com/users/greggman/gists{/gist_id}","starred_url":"https://api.github.com/users/greggman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/greggman/subscriptions","organizations_url":"https://api.github.com/users/greggman/orgs","repos_url":"https://api.github.com/users/greggman/repos","events_url":"https://api.github.com/users/greggman/events{/privacy}","received_events_url":"https://api.github.com/users/greggman/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1318},{"login":"diskhkme","id":7402686,"node_id":"MDQ6VXNlcjc0MDI2ODY=","avatar_url":"https://avatars.githubusercontent.com/u/7402686?v=4","gravatar_id":"","url":"https://api.github.com/users/diskhkme","html_url":"https://github.com/diskhkme","followers_url":"https://api.github.com/users/diskhkme/followers","following_url":"https://api.github.com/users/diskhkme/following{/other_user}","gists_url":"https://api.github.com/users/diskhkme/gists{/gist_id}","starred_url":"https://api.github.com/users/diskhkme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/diskhkme/subscriptions","organizations_url":"https://api.github.com/users/diskhkme/orgs","repos_url":"https://api.github.com/users/diskhkme/repos","events_url":"https://api.github.com/users/diskhkme/events{/privacy}","received_events_url":"https://api.github.com/users/diskhkme/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":70},{"login":"jeongsd","id":7903426,"node_id":"MDQ6VXNlcjc5MDM0MjY=","avatar_url":"https://avatars.githubusercontent.com/u/7903426?v=4","gravatar_id":"","url":"https://api.github.com/users/jeongsd","html_url":"https://github.com/jeongsd","followers_url":"https://api.github.com/users/jeongsd/followers","following_url":"https://api.github.com/users/jeongsd/following{/other_user}","gists_url":"https://api.github.com/users/jeongsd/gists{/gist_id}","starred_url":"https://api.github.com/users/jeongsd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeongsd/subscriptions","organizations_url":"https://api.github.com/users/jeongsd/orgs","repos_url":"https://api.github.com/users/jeongsd/repos","events_url":"https://api.github.com/users/jeongsd/events{/privacy}","received_events_url":"https://api.github.com/users/jeongsd/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":37},{"login":"ihwf","id":17941662,"node_id":"MDQ6VXNlcjE3OTQxNjYy","avatar_url":"https://avatars.githubusercontent.com/u/17941662?v=4","gravatar_id":"","url":"https://api.github.com/users/ihwf","html_url":"https://github.com/ihwf","followers_url":"https://api.github.com/users/ihwf/followers","following_url":"https://api.github.com/users/ihwf/following{/other_user}","gists_url":"https://api.github.com/users/ihwf/gists{/gist_id}","starred_url":"https://api.github.com/users/ihwf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ihwf/subscriptions","organizations_url":"https://api.github.com/users/ihwf/orgs","repos_url":"https://api.github.com/users/ihwf/repos","events_url":"https://api.github.com/users/ihwf/events{/privacy}","received_events_url":"https://api.github.com/users/ihwf/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":20},{"login":"joonas-yoon","id":9527681,"node_id":"MDQ6VXNlcjk1Mjc2ODE=","avatar_url":"https://avatars.githubusercontent.com/u/9527681?v=4","gravatar_id":"","url":"https://api.github.com/users/joonas-yoon","html_url":"https://github.com/joonas-yoon","followers_url":"https://api.github.com/users/joonas-yoon/followers","following_url":"https://api.github.com/users/joonas-yoon/following{/other_user}","gists_url":"https://api.github.com/users/joonas-yoon/gists{/gist_id}","starred_url":"https://api.github.com/users/joonas-yoon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joonas-yoon/subscriptions","organizations_url":"https://api.github.com/users/joonas-yoon/orgs","repos_url":"https://api.github.com/users/joonas-yoon/repos","events_url":"https://api.github.com/users/joonas-yoon/events{/privacy}","received_events_url":"https://api.github.com/users/joonas-yoon/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":18},{"login":"daniel-alvesg","id":28873153,"node_id":"MDQ6VXNlcjI4ODczMTUz","avatar_url":"https://avatars.githubusercontent.com/u/28873153?v=4","gravatar_id":"","url":"https://api.github.com/users/daniel-alvesg","html_url":"https://github.com/daniel-alvesg","followers_url":"https://api.github.com/users/daniel-alvesg/followers","following_url":"https://api.github.com/users/daniel-alvesg/following{/other_user}","gists_url":"https://api.github.com/users/daniel-alvesg/gists{/gist_id}","starred_url":"https://api.github.com/users/daniel-alvesg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daniel-alvesg/subscriptions","organizations_url":"https://api.github.com/users/daniel-alvesg/orgs","repos_url":"https://api.github.com/users/daniel-alvesg/repos","events_url":"https://api.github.com/users/daniel-alvesg/events{/privacy}","received_events_url":"https://api.github.com/users/daniel-alvesg/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":14},{"login":"vinci-mz","id":13175283,"node_id":"MDQ6VXNlcjEzMTc1Mjgz","avatar_url":"https://avatars.githubusercontent.com/u/13175283?v=4","gravatar_id":"","url":"https://api.github.com/users/vinci-mz","html_url":"https://github.com/vinci-mz","followers_url":"https://api.github.com/users/vinci-mz/followers","following_url":"https://api.github.com/users/vinci-mz/following{/other_user}","gists_url":"https://api.github.com/users/vinci-mz/gists{/gist_id}","starred_url":"https://api.github.com/users/vinci-mz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vinci-mz/subscriptions","organizations_url":"https://api.github.com/users/vinci-mz/orgs","repos_url":"https://api.github.com/users/vinci-mz/repos","events_url":"https://api.github.com/users/vinci-mz/events{/privacy}","received_events_url":"https://api.github.com/users/vinci-mz/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":12},{"login":"naotaro0123","id":3956770,"node_id":"MDQ6VXNlcjM5NTY3NzA=","avatar_url":"https://avatars.githubusercontent.com/u/3956770?v=4","gravatar_id":"","url":"https://api.github.com/users/naotaro0123","html_url":"https://github.com/naotaro0123","followers_url":"https://api.github.com/users/naotaro0123/followers","following_url":"https://api.github.com/users/naotaro0123/following{/other_user}","gists_url":"https://api.github.com/users/naotaro0123/gists{/gist_id}","starred_url":"https://api.github.com/users/naotaro0123/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/naotaro0123/subscriptions","organizations_url":"https://api.github.com/users/naotaro0123/orgs","repos_url":"https://api.github.com/users/naotaro0123/repos","events_url":"https://api.github.com/users/naotaro0123/events{/privacy}","received_events_url":"https://api.github.com/users/naotaro0123/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":11},{"login":"davcri","id":6860637,"node_id":"MDQ6VXNlcjY4NjA2Mzc=","avatar_url":"https://avatars.githubusercontent.com/u/6860637?v=4","gravatar_id":"","url":"https://api.github.com/users/davcri","html_url":"https://github.com/davcri","followers_url":"https://api.github.com/users/davcri/followers","following_url":"https://api.github.com/users/davcri/following{/other_user}","gists_url":"https://api.github.com/users/davcri/gists{/gist_id}","starred_url":"https://api.github.com/users/davcri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davcri/subscriptions","organizations_url":"https://api.github.com/users/davcri/orgs","repos_url":"https://api.github.com/users/davcri/repos","events_url":"https://api.github.com/users/davcri/events{/privacy}","received_events_url":"https://api.github.com/users/davcri/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":5},{"login":"Kaesebrot84","id":13865115,"node_id":"MDQ6VXNlcjEzODY1MTE1","avatar_url":"https://avatars.githubusercontent.com/u/13865115?v=4","gravatar_id":"","url":"https://api.github.com/users/Kaesebrot84","html_url":"https://github.com/Kaesebrot84","followers_url":"https://api.github.com/users/Kaesebrot84/followers","following_url":"https://api.github.com/users/Kaesebrot84/following{/other_user}","gists_url":"https://api.github.com/users/Kaesebrot84/gists{/gist_id}","starred_url":"https://api.github.com/users/Kaesebrot84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kaesebrot84/subscriptions","organizations_url":"https://api.github.com/users/Kaesebrot84/orgs","repos_url":"https://api.github.com/users/Kaesebrot84/repos","events_url":"https://api.github.com/users/Kaesebrot84/events{/privacy}","received_events_url":"https://api.github.com/users/Kaesebrot84/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"jiebai","id":5625498,"node_id":"MDQ6VXNlcjU2MjU0OTg=","avatar_url":"https://avatars.githubusercontent.com/u/5625498?v=4","gravatar_id":"","url":"https://api.github.com/users/jiebai","html_url":"https://github.com/jiebai","followers_url":"https://api.github.com/users/jiebai/followers","following_url":"https://api.github.com/users/jiebai/following{/other_user}","gists_url":"https://api.github.com/users/jiebai/gists{/gist_id}","starred_url":"https://api.github.com/users/jiebai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jiebai/subscriptions","organizations_url":"https://api.github.com/users/jiebai/orgs","repos_url":"https://api.github.com/users/jiebai/repos","events_url":"https://api.github.com/users/jiebai/events{/privacy}","received_events_url":"https://api.github.com/users/jiebai/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"yunsii","id":18096089,"node_id":"MDQ6VXNlcjE4MDk2MDg5","avatar_url":"https://avatars.githubusercontent.com/u/18096089?v=4","gravatar_id":"","url":"https://api.github.com/users/yunsii","html_url":"https://github.com/yunsii","followers_url":"https://api.github.com/users/yunsii/followers","following_url":"https://api.github.com/users/yunsii/following{/other_user}","gists_url":"https://api.github.com/users/yunsii/gists{/gist_id}","starred_url":"https://api.github.com/users/yunsii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yunsii/subscriptions","organizations_url":"https://api.github.com/users/yunsii/orgs","repos_url":"https://api.github.com/users/yunsii/repos","events_url":"https://api.github.com/users/yunsii/events{/privacy}","received_events_url":"https://api.github.com/users/yunsii/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"wpp","id":942021,"node_id":"MDQ6VXNlcjk0MjAyMQ==","avatar_url":"https://avatars.githubusercontent.com/u/942021?v=4","gravatar_id":"","url":"https://api.github.com/users/wpp","html_url":"https://github.com/wpp","followers_url":"https://api.github.com/users/wpp/followers","following_url":"https://api.github.com/users/wpp/following{/other_user}","gists_url":"https://api.github.com/users/wpp/gists{/gist_id}","starred_url":"https://api.github.com/users/wpp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wpp/subscriptions","organizations_url":"https://api.github.com/users/wpp/orgs","repos_url":"https://api.github.com/users/wpp/repos","events_url":"https://api.github.com/users/wpp/events{/privacy}","received_events_url":"https://api.github.com/users/wpp/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"afilahkle","id":90985041,"node_id":"MDQ6VXNlcjkwOTg1MDQx","avatar_url":"https://avatars.githubusercontent.com/u/90985041?v=4","gravatar_id":"","url":"https://api.github.com/users/afilahkle","html_url":"https://github.com/afilahkle","followers_url":"https://api.github.com/users/afilahkle/followers","following_url":"https://api.github.com/users/afilahkle/following{/other_user}","gists_url":"https://api.github.com/users/afilahkle/gists{/gist_id}","starred_url":"https://api.github.com/users/afilahkle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/afilahkle/subscriptions","organizations_url":"https://api.github.com/users/afilahkle/orgs","repos_url":"https://api.github.com/users/afilahkle/repos","events_url":"https://api.github.com/users/afilahkle/events{/privacy}","received_events_url":"https://api.github.com/users/afilahkle/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"MaxDesiatov","id":112310,"node_id":"MDQ6VXNlcjExMjMxMA==","avatar_url":"https://avatars.githubusercontent.com/u/112310?v=4","gravatar_id":"","url":"https://api.github.com/users/MaxDesiatov","html_url":"https://github.com/MaxDesiatov","followers_url":"https://api.github.com/users/MaxDesiatov/followers","following_url":"https://api.github.com/users/MaxDesiatov/following{/other_user}","gists_url":"https://api.github.com/users/MaxDesiatov/gists{/gist_id}","starred_url":"https://api.github.com/users/MaxDesiatov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MaxDesiatov/subscriptions","organizations_url":"https://api.github.com/users/MaxDesiatov/orgs","repos_url":"https://api.github.com/users/MaxDesiatov/repos","events_url":"https://api.github.com/users/MaxDesiatov/events{/privacy}","received_events_url":"https://api.github.com/users/MaxDesiatov/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"KY246","id":62805908,"node_id":"MDQ6VXNlcjYyODA1OTA4","avatar_url":"https://avatars.githubusercontent.com/u/62805908?v=4","gravatar_id":"","url":"https://api.github.com/users/KY246","html_url":"https://github.com/KY246","followers_url":"https://api.github.com/users/KY246/followers","following_url":"https://api.github.com/users/KY246/following{/other_user}","gists_url":"https://api.github.com/users/KY246/gists{/gist_id}","starred_url":"https://api.github.com/users/KY246/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KY246/subscriptions","organizations_url":"https://api.github.com/users/KY246/orgs","repos_url":"https://api.github.com/users/KY246/repos","events_url":"https://api.github.com/users/KY246/events{/privacy}","received_events_url":"https://api.github.com/users/KY246/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"adkelley","id":5614766,"node_id":"MDQ6VXNlcjU2MTQ3NjY=","avatar_url":"https://avatars.githubusercontent.com/u/5614766?v=4","gravatar_id":"","url":"https://api.github.com/users/adkelley","html_url":"https://github.com/adkelley","followers_url":"https://api.github.com/users/adkelley/followers","following_url":"https://api.github.com/users/adkelley/following{/other_user}","gists_url":"https://api.github.com/users/adkelley/gists{/gist_id}","starred_url":"https://api.github.com/users/adkelley/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adkelley/subscriptions","organizations_url":"https://api.github.com/users/adkelley/orgs","repos_url":"https://api.github.com/users/adkelley/repos","events_url":"https://api.github.com/users/adkelley/events{/privacy}","received_events_url":"https://api.github.com/users/adkelley/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"06wj","id":800043,"node_id":"MDQ6VXNlcjgwMDA0Mw==","avatar_url":"https://avatars.githubusercontent.com/u/800043?v=4","gravatar_id":"","url":"https://api.github.com/users/06wj","html_url":"https://github.com/06wj","followers_url":"https://api.github.com/users/06wj/followers","following_url":"https://api.github.com/users/06wj/following{/other_user}","gists_url":"https://api.github.com/users/06wj/gists{/gist_id}","starred_url":"https://api.github.com/users/06wj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/06wj/subscriptions","organizations_url":"https://api.github.com/users/06wj/orgs","repos_url":"https://api.github.com/users/06wj/repos","events_url":"https://api.github.com/users/06wj/events{/privacy}","received_events_url":"https://api.github.com/users/06wj/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"Astrak","id":10037511,"node_id":"MDQ6VXNlcjEwMDM3NTEx","avatar_url":"https://avatars.githubusercontent.com/u/10037511?v=4","gravatar_id":"","url":"https://api.github.com/users/Astrak","html_url":"https://github.com/Astrak","followers_url":"https://api.github.com/users/Astrak/followers","following_url":"https://api.github.com/users/Astrak/following{/other_user}","gists_url":"https://api.github.com/users/Astrak/gists{/gist_id}","starred_url":"https://api.github.com/users/Astrak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Astrak/subscriptions","organizations_url":"https://api.github.com/users/Astrak/orgs","repos_url":"https://api.github.com/users/Astrak/repos","events_url":"https://api.github.com/users/Astrak/events{/privacy}","received_events_url":"https://api.github.com/users/Astrak/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"Kurtil","id":22523482,"node_id":"MDQ6VXNlcjIyNTIzNDgy","avatar_url":"https://avatars.githubusercontent.com/u/22523482?v=4","gravatar_id":"","url":"https://api.github.com/users/Kurtil","html_url":"https://github.com/Kurtil","followers_url":"https://api.github.com/users/Kurtil/followers","following_url":"https://api.github.com/users/Kurtil/following{/other_user}","gists_url":"https://api.github.com/users/Kurtil/gists{/gist_id}","starred_url":"https://api.github.com/users/Kurtil/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kurtil/subscriptions","organizations_url":"https://api.github.com/users/Kurtil/orgs","repos_url":"https://api.github.com/users/Kurtil/repos","events_url":"https://api.github.com/users/Kurtil/events{/privacy}","received_events_url":"https://api.github.com/users/Kurtil/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"zackurben","id":2689122,"node_id":"MDQ6VXNlcjI2ODkxMjI=","avatar_url":"https://avatars.githubusercontent.com/u/2689122?v=4","gravatar_id":"","url":"https://api.github.com/users/zackurben","html_url":"https://github.com/zackurben","followers_url":"https://api.github.com/users/zackurben/followers","following_url":"https://api.github.com/users/zackurben/following{/other_user}","gists_url":"https://api.github.com/users/zackurben/gists{/gist_id}","starred_url":"https://api.github.com/users/zackurben/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zackurben/subscriptions","organizations_url":"https://api.github.com/users/zackurben/orgs","repos_url":"https://api.github.com/users/zackurben/repos","events_url":"https://api.github.com/users/zackurben/events{/privacy}","received_events_url":"https://api.github.com/users/zackurben/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"billytrend","id":6671020,"node_id":"MDQ6VXNlcjY2NzEwMjA=","avatar_url":"https://avatars.githubusercontent.com/u/6671020?v=4","gravatar_id":"","url":"https://api.github.com/users/billytrend","html_url":"https://github.com/billytrend","followers_url":"https://api.github.com/users/billytrend/followers","following_url":"https://api.github.com/users/billytrend/following{/other_user}","gists_url":"https://api.github.com/users/billytrend/gists{/gist_id}","starred_url":"https://api.github.com/users/billytrend/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/billytrend/subscriptions","organizations_url":"https://api.github.com/users/billytrend/orgs","repos_url":"https://api.github.com/users/billytrend/repos","events_url":"https://api.github.com/users/billytrend/events{/privacy}","received_events_url":"https://api.github.com/users/billytrend/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"Shubidumdu","id":54790378,"node_id":"MDQ6VXNlcjU0NzkwMzc4","avatar_url":"https://avatars.githubusercontent.com/u/54790378?v=4","gravatar_id":"","url":"https://api.github.com/users/Shubidumdu","html_url":"https://github.com/Shubidumdu","followers_url":"https://api.github.com/users/Shubidumdu/followers","following_url":"https://api.github.com/users/Shubidumdu/following{/other_user}","gists_url":"https://api.github.com/users/Shubidumdu/gists{/gist_id}","starred_url":"https://api.github.com/users/Shubidumdu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Shubidumdu/subscriptions","organizations_url":"https://api.github.com/users/Shubidumdu/orgs","repos_url":"https://api.github.com/users/Shubidumdu/repos","events_url":"https://api.github.com/users/Shubidumdu/events{/privacy}","received_events_url":"https://api.github.com/users/Shubidumdu/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"lazygyu","id":1005952,"node_id":"MDQ6VXNlcjEwMDU5NTI=","avatar_url":"https://avatars.githubusercontent.com/u/1005952?v=4","gravatar_id":"","url":"https://api.github.com/users/lazygyu","html_url":"https://github.com/lazygyu","followers_url":"https://api.github.com/users/lazygyu/followers","following_url":"https://api.github.com/users/lazygyu/following{/other_user}","gists_url":"https://api.github.com/users/lazygyu/gists{/gist_id}","starred_url":"https://api.github.com/users/lazygyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lazygyu/subscriptions","organizations_url":"https://api.github.com/users/lazygyu/orgs","repos_url":"https://api.github.com/users/lazygyu/repos","events_url":"https://api.github.com/users/lazygyu/events{/privacy}","received_events_url":"https://api.github.com/users/lazygyu/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"alicialics","id":31378877,"node_id":"MDQ6VXNlcjMxMzc4ODc3","avatar_url":"https://avatars.githubusercontent.com/u/31378877?v=4","gravatar_id":"","url":"https://api.github.com/users/alicialics","html_url":"https://github.com/alicialics","followers_url":"https://api.github.com/users/alicialics/followers","following_url":"https://api.github.com/users/alicialics/following{/other_user}","gists_url":"https://api.github.com/users/alicialics/gists{/gist_id}","starred_url":"https://api.github.com/users/alicialics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alicialics/subscriptions","organizations_url":"https://api.github.com/users/alicialics/orgs","repos_url":"https://api.github.com/users/alicialics/repos","events_url":"https://api.github.com/users/alicialics/events{/privacy}","received_events_url":"https://api.github.com/users/alicialics/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"grovesNL","id":2113872,"node_id":"MDQ6VXNlcjIxMTM4NzI=","avatar_url":"https://avatars.githubusercontent.com/u/2113872?v=4","gravatar_id":"","url":"https://api.github.com/users/grovesNL","html_url":"https://github.com/grovesNL","followers_url":"https://api.github.com/users/grovesNL/followers","following_url":"https://api.github.com/users/grovesNL/following{/other_user}","gists_url":"https://api.github.com/users/grovesNL/gists{/gist_id}","starred_url":"https://api.github.com/users/grovesNL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/grovesNL/subscriptions","organizations_url":"https://api.github.com/users/grovesNL/orgs","repos_url":"https://api.github.com/users/grovesNL/repos","events_url":"https://api.github.com/users/grovesNL/events{/privacy}","received_events_url":"https://api.github.com/users/grovesNL/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"cdry","id":20787516,"node_id":"MDQ6VXNlcjIwNzg3NTE2","avatar_url":"https://avatars.githubusercontent.com/u/20787516?v=4","gravatar_id":"","url":"https://api.github.com/users/cdry","html_url":"https://github.com/cdry","followers_url":"https://api.github.com/users/cdry/followers","following_url":"https://api.github.com/users/cdry/following{/other_user}","gists_url":"https://api.github.com/users/cdry/gists{/gist_id}","starred_url":"https://api.github.com/users/cdry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cdry/subscriptions","organizations_url":"https://api.github.com/users/cdry/orgs","repos_url":"https://api.github.com/users/cdry/repos","events_url":"https://api.github.com/users/cdry/events{/privacy}","received_events_url":"https://api.github.com/users/cdry/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"ahaoboy","id":19884146,"node_id":"MDQ6VXNlcjE5ODg0MTQ2","avatar_url":"https://avatars.githubusercontent.com/u/19884146?v=4","gravatar_id":"","url":"https://api.github.com/users/ahaoboy","html_url":"https://github.com/ahaoboy","followers_url":"https://api.github.com/users/ahaoboy/followers","following_url":"https://api.github.com/users/ahaoboy/following{/other_user}","gists_url":"https://api.github.com/users/ahaoboy/gists{/gist_id}","starred_url":"https://api.github.com/users/ahaoboy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahaoboy/subscriptions","organizations_url":"https://api.github.com/users/ahaoboy/orgs","repos_url":"https://api.github.com/users/ahaoboy/repos","events_url":"https://api.github.com/users/ahaoboy/events{/privacy}","received_events_url":"https://api.github.com/users/ahaoboy/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"dcrystalj","id":1460727,"node_id":"MDQ6VXNlcjE0NjA3Mjc=","avatar_url":"https://avatars.githubusercontent.com/u/1460727?v=4","gravatar_id":"","url":"https://api.github.com/users/dcrystalj","html_url":"https://github.com/dcrystalj","followers_url":"https://api.github.com/users/dcrystalj/followers","following_url":"https://api.github.com/users/dcrystalj/following{/other_user}","gists_url":"https://api.github.com/users/dcrystalj/gists{/gist_id}","starred_url":"https://api.github.com/users/dcrystalj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcrystalj/subscriptions","organizations_url":"https://api.github.com/users/dcrystalj/orgs","repos_url":"https://api.github.com/users/dcrystalj/repos","events_url":"https://api.github.com/users/dcrystalj/events{/privacy}","received_events_url":"https://api.github.com/users/dcrystalj/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"mattbilson","id":243331,"node_id":"MDQ6VXNlcjI0MzMzMQ==","avatar_url":"https://avatars.githubusercontent.com/u/243331?v=4","gravatar_id":"","url":"https://api.github.com/users/mattbilson","html_url":"https://github.com/mattbilson","followers_url":"https://api.github.com/users/mattbilson/followers","following_url":"https://api.github.com/users/mattbilson/following{/other_user}","gists_url":"https://api.github.com/users/mattbilson/gists{/gist_id}","starred_url":"https://api.github.com/users/mattbilson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattbilson/subscriptions","organizations_url":"https://api.github.com/users/mattbilson/orgs","repos_url":"https://api.github.com/users/mattbilson/repos","events_url":"https://api.github.com/users/mattbilson/events{/privacy}","received_events_url":"https://api.github.com/users/mattbilson/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2}]; +const contributors = [{"login":"greggman","id":234804,"node_id":"MDQ6VXNlcjIzNDgwNA==","avatar_url":"https://avatars.githubusercontent.com/u/234804?v=4","gravatar_id":"","url":"https://api.github.com/users/greggman","html_url":"https://github.com/greggman","followers_url":"https://api.github.com/users/greggman/followers","following_url":"https://api.github.com/users/greggman/following{/other_user}","gists_url":"https://api.github.com/users/greggman/gists{/gist_id}","starred_url":"https://api.github.com/users/greggman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/greggman/subscriptions","organizations_url":"https://api.github.com/users/greggman/orgs","repos_url":"https://api.github.com/users/greggman/repos","events_url":"https://api.github.com/users/greggman/events{/privacy}","received_events_url":"https://api.github.com/users/greggman/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":1319},{"login":"diskhkme","id":7402686,"node_id":"MDQ6VXNlcjc0MDI2ODY=","avatar_url":"https://avatars.githubusercontent.com/u/7402686?v=4","gravatar_id":"","url":"https://api.github.com/users/diskhkme","html_url":"https://github.com/diskhkme","followers_url":"https://api.github.com/users/diskhkme/followers","following_url":"https://api.github.com/users/diskhkme/following{/other_user}","gists_url":"https://api.github.com/users/diskhkme/gists{/gist_id}","starred_url":"https://api.github.com/users/diskhkme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/diskhkme/subscriptions","organizations_url":"https://api.github.com/users/diskhkme/orgs","repos_url":"https://api.github.com/users/diskhkme/repos","events_url":"https://api.github.com/users/diskhkme/events{/privacy}","received_events_url":"https://api.github.com/users/diskhkme/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":70},{"login":"jeongsd","id":7903426,"node_id":"MDQ6VXNlcjc5MDM0MjY=","avatar_url":"https://avatars.githubusercontent.com/u/7903426?v=4","gravatar_id":"","url":"https://api.github.com/users/jeongsd","html_url":"https://github.com/jeongsd","followers_url":"https://api.github.com/users/jeongsd/followers","following_url":"https://api.github.com/users/jeongsd/following{/other_user}","gists_url":"https://api.github.com/users/jeongsd/gists{/gist_id}","starred_url":"https://api.github.com/users/jeongsd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeongsd/subscriptions","organizations_url":"https://api.github.com/users/jeongsd/orgs","repos_url":"https://api.github.com/users/jeongsd/repos","events_url":"https://api.github.com/users/jeongsd/events{/privacy}","received_events_url":"https://api.github.com/users/jeongsd/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":37},{"login":"ihwf","id":17941662,"node_id":"MDQ6VXNlcjE3OTQxNjYy","avatar_url":"https://avatars.githubusercontent.com/u/17941662?v=4","gravatar_id":"","url":"https://api.github.com/users/ihwf","html_url":"https://github.com/ihwf","followers_url":"https://api.github.com/users/ihwf/followers","following_url":"https://api.github.com/users/ihwf/following{/other_user}","gists_url":"https://api.github.com/users/ihwf/gists{/gist_id}","starred_url":"https://api.github.com/users/ihwf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ihwf/subscriptions","organizations_url":"https://api.github.com/users/ihwf/orgs","repos_url":"https://api.github.com/users/ihwf/repos","events_url":"https://api.github.com/users/ihwf/events{/privacy}","received_events_url":"https://api.github.com/users/ihwf/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":20},{"login":"joonas-yoon","id":9527681,"node_id":"MDQ6VXNlcjk1Mjc2ODE=","avatar_url":"https://avatars.githubusercontent.com/u/9527681?v=4","gravatar_id":"","url":"https://api.github.com/users/joonas-yoon","html_url":"https://github.com/joonas-yoon","followers_url":"https://api.github.com/users/joonas-yoon/followers","following_url":"https://api.github.com/users/joonas-yoon/following{/other_user}","gists_url":"https://api.github.com/users/joonas-yoon/gists{/gist_id}","starred_url":"https://api.github.com/users/joonas-yoon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joonas-yoon/subscriptions","organizations_url":"https://api.github.com/users/joonas-yoon/orgs","repos_url":"https://api.github.com/users/joonas-yoon/repos","events_url":"https://api.github.com/users/joonas-yoon/events{/privacy}","received_events_url":"https://api.github.com/users/joonas-yoon/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":18},{"login":"daniel-alvesg","id":28873153,"node_id":"MDQ6VXNlcjI4ODczMTUz","avatar_url":"https://avatars.githubusercontent.com/u/28873153?v=4","gravatar_id":"","url":"https://api.github.com/users/daniel-alvesg","html_url":"https://github.com/daniel-alvesg","followers_url":"https://api.github.com/users/daniel-alvesg/followers","following_url":"https://api.github.com/users/daniel-alvesg/following{/other_user}","gists_url":"https://api.github.com/users/daniel-alvesg/gists{/gist_id}","starred_url":"https://api.github.com/users/daniel-alvesg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daniel-alvesg/subscriptions","organizations_url":"https://api.github.com/users/daniel-alvesg/orgs","repos_url":"https://api.github.com/users/daniel-alvesg/repos","events_url":"https://api.github.com/users/daniel-alvesg/events{/privacy}","received_events_url":"https://api.github.com/users/daniel-alvesg/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":14},{"login":"vinci-mz","id":13175283,"node_id":"MDQ6VXNlcjEzMTc1Mjgz","avatar_url":"https://avatars.githubusercontent.com/u/13175283?v=4","gravatar_id":"","url":"https://api.github.com/users/vinci-mz","html_url":"https://github.com/vinci-mz","followers_url":"https://api.github.com/users/vinci-mz/followers","following_url":"https://api.github.com/users/vinci-mz/following{/other_user}","gists_url":"https://api.github.com/users/vinci-mz/gists{/gist_id}","starred_url":"https://api.github.com/users/vinci-mz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vinci-mz/subscriptions","organizations_url":"https://api.github.com/users/vinci-mz/orgs","repos_url":"https://api.github.com/users/vinci-mz/repos","events_url":"https://api.github.com/users/vinci-mz/events{/privacy}","received_events_url":"https://api.github.com/users/vinci-mz/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":12},{"login":"naotaro0123","id":3956770,"node_id":"MDQ6VXNlcjM5NTY3NzA=","avatar_url":"https://avatars.githubusercontent.com/u/3956770?v=4","gravatar_id":"","url":"https://api.github.com/users/naotaro0123","html_url":"https://github.com/naotaro0123","followers_url":"https://api.github.com/users/naotaro0123/followers","following_url":"https://api.github.com/users/naotaro0123/following{/other_user}","gists_url":"https://api.github.com/users/naotaro0123/gists{/gist_id}","starred_url":"https://api.github.com/users/naotaro0123/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/naotaro0123/subscriptions","organizations_url":"https://api.github.com/users/naotaro0123/orgs","repos_url":"https://api.github.com/users/naotaro0123/repos","events_url":"https://api.github.com/users/naotaro0123/events{/privacy}","received_events_url":"https://api.github.com/users/naotaro0123/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":11},{"login":"davcri","id":6860637,"node_id":"MDQ6VXNlcjY4NjA2Mzc=","avatar_url":"https://avatars.githubusercontent.com/u/6860637?v=4","gravatar_id":"","url":"https://api.github.com/users/davcri","html_url":"https://github.com/davcri","followers_url":"https://api.github.com/users/davcri/followers","following_url":"https://api.github.com/users/davcri/following{/other_user}","gists_url":"https://api.github.com/users/davcri/gists{/gist_id}","starred_url":"https://api.github.com/users/davcri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davcri/subscriptions","organizations_url":"https://api.github.com/users/davcri/orgs","repos_url":"https://api.github.com/users/davcri/repos","events_url":"https://api.github.com/users/davcri/events{/privacy}","received_events_url":"https://api.github.com/users/davcri/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":5},{"login":"Kaesebrot84","id":13865115,"node_id":"MDQ6VXNlcjEzODY1MTE1","avatar_url":"https://avatars.githubusercontent.com/u/13865115?v=4","gravatar_id":"","url":"https://api.github.com/users/Kaesebrot84","html_url":"https://github.com/Kaesebrot84","followers_url":"https://api.github.com/users/Kaesebrot84/followers","following_url":"https://api.github.com/users/Kaesebrot84/following{/other_user}","gists_url":"https://api.github.com/users/Kaesebrot84/gists{/gist_id}","starred_url":"https://api.github.com/users/Kaesebrot84/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kaesebrot84/subscriptions","organizations_url":"https://api.github.com/users/Kaesebrot84/orgs","repos_url":"https://api.github.com/users/Kaesebrot84/repos","events_url":"https://api.github.com/users/Kaesebrot84/events{/privacy}","received_events_url":"https://api.github.com/users/Kaesebrot84/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"jiebai","id":5625498,"node_id":"MDQ6VXNlcjU2MjU0OTg=","avatar_url":"https://avatars.githubusercontent.com/u/5625498?v=4","gravatar_id":"","url":"https://api.github.com/users/jiebai","html_url":"https://github.com/jiebai","followers_url":"https://api.github.com/users/jiebai/followers","following_url":"https://api.github.com/users/jiebai/following{/other_user}","gists_url":"https://api.github.com/users/jiebai/gists{/gist_id}","starred_url":"https://api.github.com/users/jiebai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jiebai/subscriptions","organizations_url":"https://api.github.com/users/jiebai/orgs","repos_url":"https://api.github.com/users/jiebai/repos","events_url":"https://api.github.com/users/jiebai/events{/privacy}","received_events_url":"https://api.github.com/users/jiebai/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"yunsii","id":18096089,"node_id":"MDQ6VXNlcjE4MDk2MDg5","avatar_url":"https://avatars.githubusercontent.com/u/18096089?v=4","gravatar_id":"","url":"https://api.github.com/users/yunsii","html_url":"https://github.com/yunsii","followers_url":"https://api.github.com/users/yunsii/followers","following_url":"https://api.github.com/users/yunsii/following{/other_user}","gists_url":"https://api.github.com/users/yunsii/gists{/gist_id}","starred_url":"https://api.github.com/users/yunsii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yunsii/subscriptions","organizations_url":"https://api.github.com/users/yunsii/orgs","repos_url":"https://api.github.com/users/yunsii/repos","events_url":"https://api.github.com/users/yunsii/events{/privacy}","received_events_url":"https://api.github.com/users/yunsii/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"wpp","id":942021,"node_id":"MDQ6VXNlcjk0MjAyMQ==","avatar_url":"https://avatars.githubusercontent.com/u/942021?v=4","gravatar_id":"","url":"https://api.github.com/users/wpp","html_url":"https://github.com/wpp","followers_url":"https://api.github.com/users/wpp/followers","following_url":"https://api.github.com/users/wpp/following{/other_user}","gists_url":"https://api.github.com/users/wpp/gists{/gist_id}","starred_url":"https://api.github.com/users/wpp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wpp/subscriptions","organizations_url":"https://api.github.com/users/wpp/orgs","repos_url":"https://api.github.com/users/wpp/repos","events_url":"https://api.github.com/users/wpp/events{/privacy}","received_events_url":"https://api.github.com/users/wpp/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"afilahkle","id":90985041,"node_id":"MDQ6VXNlcjkwOTg1MDQx","avatar_url":"https://avatars.githubusercontent.com/u/90985041?v=4","gravatar_id":"","url":"https://api.github.com/users/afilahkle","html_url":"https://github.com/afilahkle","followers_url":"https://api.github.com/users/afilahkle/followers","following_url":"https://api.github.com/users/afilahkle/following{/other_user}","gists_url":"https://api.github.com/users/afilahkle/gists{/gist_id}","starred_url":"https://api.github.com/users/afilahkle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/afilahkle/subscriptions","organizations_url":"https://api.github.com/users/afilahkle/orgs","repos_url":"https://api.github.com/users/afilahkle/repos","events_url":"https://api.github.com/users/afilahkle/events{/privacy}","received_events_url":"https://api.github.com/users/afilahkle/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"MaxDesiatov","id":112310,"node_id":"MDQ6VXNlcjExMjMxMA==","avatar_url":"https://avatars.githubusercontent.com/u/112310?v=4","gravatar_id":"","url":"https://api.github.com/users/MaxDesiatov","html_url":"https://github.com/MaxDesiatov","followers_url":"https://api.github.com/users/MaxDesiatov/followers","following_url":"https://api.github.com/users/MaxDesiatov/following{/other_user}","gists_url":"https://api.github.com/users/MaxDesiatov/gists{/gist_id}","starred_url":"https://api.github.com/users/MaxDesiatov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MaxDesiatov/subscriptions","organizations_url":"https://api.github.com/users/MaxDesiatov/orgs","repos_url":"https://api.github.com/users/MaxDesiatov/repos","events_url":"https://api.github.com/users/MaxDesiatov/events{/privacy}","received_events_url":"https://api.github.com/users/MaxDesiatov/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"KY246","id":62805908,"node_id":"MDQ6VXNlcjYyODA1OTA4","avatar_url":"https://avatars.githubusercontent.com/u/62805908?v=4","gravatar_id":"","url":"https://api.github.com/users/KY246","html_url":"https://github.com/KY246","followers_url":"https://api.github.com/users/KY246/followers","following_url":"https://api.github.com/users/KY246/following{/other_user}","gists_url":"https://api.github.com/users/KY246/gists{/gist_id}","starred_url":"https://api.github.com/users/KY246/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KY246/subscriptions","organizations_url":"https://api.github.com/users/KY246/orgs","repos_url":"https://api.github.com/users/KY246/repos","events_url":"https://api.github.com/users/KY246/events{/privacy}","received_events_url":"https://api.github.com/users/KY246/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"adkelley","id":5614766,"node_id":"MDQ6VXNlcjU2MTQ3NjY=","avatar_url":"https://avatars.githubusercontent.com/u/5614766?v=4","gravatar_id":"","url":"https://api.github.com/users/adkelley","html_url":"https://github.com/adkelley","followers_url":"https://api.github.com/users/adkelley/followers","following_url":"https://api.github.com/users/adkelley/following{/other_user}","gists_url":"https://api.github.com/users/adkelley/gists{/gist_id}","starred_url":"https://api.github.com/users/adkelley/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adkelley/subscriptions","organizations_url":"https://api.github.com/users/adkelley/orgs","repos_url":"https://api.github.com/users/adkelley/repos","events_url":"https://api.github.com/users/adkelley/events{/privacy}","received_events_url":"https://api.github.com/users/adkelley/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":4},{"login":"06wj","id":800043,"node_id":"MDQ6VXNlcjgwMDA0Mw==","avatar_url":"https://avatars.githubusercontent.com/u/800043?v=4","gravatar_id":"","url":"https://api.github.com/users/06wj","html_url":"https://github.com/06wj","followers_url":"https://api.github.com/users/06wj/followers","following_url":"https://api.github.com/users/06wj/following{/other_user}","gists_url":"https://api.github.com/users/06wj/gists{/gist_id}","starred_url":"https://api.github.com/users/06wj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/06wj/subscriptions","organizations_url":"https://api.github.com/users/06wj/orgs","repos_url":"https://api.github.com/users/06wj/repos","events_url":"https://api.github.com/users/06wj/events{/privacy}","received_events_url":"https://api.github.com/users/06wj/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"Astrak","id":10037511,"node_id":"MDQ6VXNlcjEwMDM3NTEx","avatar_url":"https://avatars.githubusercontent.com/u/10037511?v=4","gravatar_id":"","url":"https://api.github.com/users/Astrak","html_url":"https://github.com/Astrak","followers_url":"https://api.github.com/users/Astrak/followers","following_url":"https://api.github.com/users/Astrak/following{/other_user}","gists_url":"https://api.github.com/users/Astrak/gists{/gist_id}","starred_url":"https://api.github.com/users/Astrak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Astrak/subscriptions","organizations_url":"https://api.github.com/users/Astrak/orgs","repos_url":"https://api.github.com/users/Astrak/repos","events_url":"https://api.github.com/users/Astrak/events{/privacy}","received_events_url":"https://api.github.com/users/Astrak/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"Kurtil","id":22523482,"node_id":"MDQ6VXNlcjIyNTIzNDgy","avatar_url":"https://avatars.githubusercontent.com/u/22523482?v=4","gravatar_id":"","url":"https://api.github.com/users/Kurtil","html_url":"https://github.com/Kurtil","followers_url":"https://api.github.com/users/Kurtil/followers","following_url":"https://api.github.com/users/Kurtil/following{/other_user}","gists_url":"https://api.github.com/users/Kurtil/gists{/gist_id}","starred_url":"https://api.github.com/users/Kurtil/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kurtil/subscriptions","organizations_url":"https://api.github.com/users/Kurtil/orgs","repos_url":"https://api.github.com/users/Kurtil/repos","events_url":"https://api.github.com/users/Kurtil/events{/privacy}","received_events_url":"https://api.github.com/users/Kurtil/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"zackurben","id":2689122,"node_id":"MDQ6VXNlcjI2ODkxMjI=","avatar_url":"https://avatars.githubusercontent.com/u/2689122?v=4","gravatar_id":"","url":"https://api.github.com/users/zackurben","html_url":"https://github.com/zackurben","followers_url":"https://api.github.com/users/zackurben/followers","following_url":"https://api.github.com/users/zackurben/following{/other_user}","gists_url":"https://api.github.com/users/zackurben/gists{/gist_id}","starred_url":"https://api.github.com/users/zackurben/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zackurben/subscriptions","organizations_url":"https://api.github.com/users/zackurben/orgs","repos_url":"https://api.github.com/users/zackurben/repos","events_url":"https://api.github.com/users/zackurben/events{/privacy}","received_events_url":"https://api.github.com/users/zackurben/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"billytrend","id":6671020,"node_id":"MDQ6VXNlcjY2NzEwMjA=","avatar_url":"https://avatars.githubusercontent.com/u/6671020?v=4","gravatar_id":"","url":"https://api.github.com/users/billytrend","html_url":"https://github.com/billytrend","followers_url":"https://api.github.com/users/billytrend/followers","following_url":"https://api.github.com/users/billytrend/following{/other_user}","gists_url":"https://api.github.com/users/billytrend/gists{/gist_id}","starred_url":"https://api.github.com/users/billytrend/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/billytrend/subscriptions","organizations_url":"https://api.github.com/users/billytrend/orgs","repos_url":"https://api.github.com/users/billytrend/repos","events_url":"https://api.github.com/users/billytrend/events{/privacy}","received_events_url":"https://api.github.com/users/billytrend/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"Shubidumdu","id":54790378,"node_id":"MDQ6VXNlcjU0NzkwMzc4","avatar_url":"https://avatars.githubusercontent.com/u/54790378?v=4","gravatar_id":"","url":"https://api.github.com/users/Shubidumdu","html_url":"https://github.com/Shubidumdu","followers_url":"https://api.github.com/users/Shubidumdu/followers","following_url":"https://api.github.com/users/Shubidumdu/following{/other_user}","gists_url":"https://api.github.com/users/Shubidumdu/gists{/gist_id}","starred_url":"https://api.github.com/users/Shubidumdu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Shubidumdu/subscriptions","organizations_url":"https://api.github.com/users/Shubidumdu/orgs","repos_url":"https://api.github.com/users/Shubidumdu/repos","events_url":"https://api.github.com/users/Shubidumdu/events{/privacy}","received_events_url":"https://api.github.com/users/Shubidumdu/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":3},{"login":"lazygyu","id":1005952,"node_id":"MDQ6VXNlcjEwMDU5NTI=","avatar_url":"https://avatars.githubusercontent.com/u/1005952?v=4","gravatar_id":"","url":"https://api.github.com/users/lazygyu","html_url":"https://github.com/lazygyu","followers_url":"https://api.github.com/users/lazygyu/followers","following_url":"https://api.github.com/users/lazygyu/following{/other_user}","gists_url":"https://api.github.com/users/lazygyu/gists{/gist_id}","starred_url":"https://api.github.com/users/lazygyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lazygyu/subscriptions","organizations_url":"https://api.github.com/users/lazygyu/orgs","repos_url":"https://api.github.com/users/lazygyu/repos","events_url":"https://api.github.com/users/lazygyu/events{/privacy}","received_events_url":"https://api.github.com/users/lazygyu/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"alicialics","id":31378877,"node_id":"MDQ6VXNlcjMxMzc4ODc3","avatar_url":"https://avatars.githubusercontent.com/u/31378877?v=4","gravatar_id":"","url":"https://api.github.com/users/alicialics","html_url":"https://github.com/alicialics","followers_url":"https://api.github.com/users/alicialics/followers","following_url":"https://api.github.com/users/alicialics/following{/other_user}","gists_url":"https://api.github.com/users/alicialics/gists{/gist_id}","starred_url":"https://api.github.com/users/alicialics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alicialics/subscriptions","organizations_url":"https://api.github.com/users/alicialics/orgs","repos_url":"https://api.github.com/users/alicialics/repos","events_url":"https://api.github.com/users/alicialics/events{/privacy}","received_events_url":"https://api.github.com/users/alicialics/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"grovesNL","id":2113872,"node_id":"MDQ6VXNlcjIxMTM4NzI=","avatar_url":"https://avatars.githubusercontent.com/u/2113872?v=4","gravatar_id":"","url":"https://api.github.com/users/grovesNL","html_url":"https://github.com/grovesNL","followers_url":"https://api.github.com/users/grovesNL/followers","following_url":"https://api.github.com/users/grovesNL/following{/other_user}","gists_url":"https://api.github.com/users/grovesNL/gists{/gist_id}","starred_url":"https://api.github.com/users/grovesNL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/grovesNL/subscriptions","organizations_url":"https://api.github.com/users/grovesNL/orgs","repos_url":"https://api.github.com/users/grovesNL/repos","events_url":"https://api.github.com/users/grovesNL/events{/privacy}","received_events_url":"https://api.github.com/users/grovesNL/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"cdry","id":20787516,"node_id":"MDQ6VXNlcjIwNzg3NTE2","avatar_url":"https://avatars.githubusercontent.com/u/20787516?v=4","gravatar_id":"","url":"https://api.github.com/users/cdry","html_url":"https://github.com/cdry","followers_url":"https://api.github.com/users/cdry/followers","following_url":"https://api.github.com/users/cdry/following{/other_user}","gists_url":"https://api.github.com/users/cdry/gists{/gist_id}","starred_url":"https://api.github.com/users/cdry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cdry/subscriptions","organizations_url":"https://api.github.com/users/cdry/orgs","repos_url":"https://api.github.com/users/cdry/repos","events_url":"https://api.github.com/users/cdry/events{/privacy}","received_events_url":"https://api.github.com/users/cdry/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"ahaoboy","id":19884146,"node_id":"MDQ6VXNlcjE5ODg0MTQ2","avatar_url":"https://avatars.githubusercontent.com/u/19884146?v=4","gravatar_id":"","url":"https://api.github.com/users/ahaoboy","html_url":"https://github.com/ahaoboy","followers_url":"https://api.github.com/users/ahaoboy/followers","following_url":"https://api.github.com/users/ahaoboy/following{/other_user}","gists_url":"https://api.github.com/users/ahaoboy/gists{/gist_id}","starred_url":"https://api.github.com/users/ahaoboy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahaoboy/subscriptions","organizations_url":"https://api.github.com/users/ahaoboy/orgs","repos_url":"https://api.github.com/users/ahaoboy/repos","events_url":"https://api.github.com/users/ahaoboy/events{/privacy}","received_events_url":"https://api.github.com/users/ahaoboy/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"dcrystalj","id":1460727,"node_id":"MDQ6VXNlcjE0NjA3Mjc=","avatar_url":"https://avatars.githubusercontent.com/u/1460727?v=4","gravatar_id":"","url":"https://api.github.com/users/dcrystalj","html_url":"https://github.com/dcrystalj","followers_url":"https://api.github.com/users/dcrystalj/followers","following_url":"https://api.github.com/users/dcrystalj/following{/other_user}","gists_url":"https://api.github.com/users/dcrystalj/gists{/gist_id}","starred_url":"https://api.github.com/users/dcrystalj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcrystalj/subscriptions","organizations_url":"https://api.github.com/users/dcrystalj/orgs","repos_url":"https://api.github.com/users/dcrystalj/repos","events_url":"https://api.github.com/users/dcrystalj/events{/privacy}","received_events_url":"https://api.github.com/users/dcrystalj/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2},{"login":"mattbilson","id":243331,"node_id":"MDQ6VXNlcjI0MzMzMQ==","avatar_url":"https://avatars.githubusercontent.com/u/243331?v=4","gravatar_id":"","url":"https://api.github.com/users/mattbilson","html_url":"https://github.com/mattbilson","followers_url":"https://api.github.com/users/mattbilson/followers","following_url":"https://api.github.com/users/mattbilson/following{/other_user}","gists_url":"https://api.github.com/users/mattbilson/gists{/gist_id}","starred_url":"https://api.github.com/users/mattbilson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattbilson/subscriptions","organizations_url":"https://api.github.com/users/mattbilson/orgs","repos_url":"https://api.github.com/users/mattbilson/repos","events_url":"https://api.github.com/users/mattbilson/events{/privacy}","received_events_url":"https://api.github.com/users/mattbilson/received_events","type":"User","user_view_type":"public","site_admin":false,"contributions":2}]; diff --git a/webgl/lessons/atom.xml b/webgl/lessons/atom.xml index 53d9d479..316ac38d 100644 --- a/webgl/lessons/atom.xml +++ b/webgl/lessons/atom.xml @@ -2,7 +2,7 @@ WebGL2 Fundamentals - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z https://github.com/jpmonette/feed WebGL2Fundamentals Contributors @@ -15,1650 +15,1650 @@ <![CDATA[WebGL2 Using 2 or More Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2-textures.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Implementing DrawImage]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-drawimage.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Matrices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-matrices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Implementing A Matrix Stack]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-matrix-stack.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Rotation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-rotation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Scale]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-scale.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 2D Translation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-translation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Rasterization vs 3D libraries]]> https://webgl2fundamentals.org/webgl/lessons/webgl-2d-vs-3d-library.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Cameras]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-camera.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D Geometry - Lathe]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-geometry-lathe.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Directional Lighting]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-directional.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Normal Mapping]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-normal-mapping.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Point Lighting]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-point.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Spot Lighting]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-lighting-spot.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Orthographic 3D]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-orthographic.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D Perspective Correct Texture Mapping]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-perspective-correct-texturemapping.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D Perspective]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-perspective.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-3d-textures.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 and Alpha]]> https://webgl2fundamentals.org/webgl/lessons/webgl-and-alpha.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Animation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-animation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Anti-Patterns]]> https://webgl2fundamentals.org/webgl/lessons/webgl-anti-patterns.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Attributes]]> https://webgl2fundamentals.org/webgl/lessons/webgl-attributes.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Boilerplate]]> https://webgl2fundamentals.org/webgl/lessons/webgl-boilerplate.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Cross Origin Images]]> https://webgl2fundamentals.org/webgl/lessons/webgl-cors-permission.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Cross Platform Issues]]> https://webgl2fundamentals.org/webgl/lessons/webgl-cross-platform-issues.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Cubemaps]]> https://webgl2fundamentals.org/webgl/lessons/webgl-cube-maps.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 3D - Data Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-data-textures.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Drawing Multiple Things]]> https://webgl2fundamentals.org/webgl/lessons/webgl-drawing-multiple-things.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Drawing Without Data]]> https://webgl2fundamentals.org/webgl/lessons/webgl-drawing-without-data.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Environment Maps (reflections)]]> https://webgl2fundamentals.org/webgl/lessons/webgl-environment-maps.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Fog]]> https://webgl2fundamentals.org/webgl/lessons/webgl-fog.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Framebuffers]]> https://webgl2fundamentals.org/webgl/lessons/webgl-framebuffers.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Fundamentals]]> https://webgl2fundamentals.org/webgl/lessons/webgl-fundamentals.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use WebGL2]]> https://webgl2fundamentals.org/webgl/lessons/webgl-getting-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 GPGPU]]> https://webgl2fundamentals.org/webgl/lessons/webgl-gpgpu.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 How It Works]]> https://webgl2fundamentals.org/webgl/lessons/webgl-how-it-works.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Image Processing Continued]]> https://webgl2fundamentals.org/webgl/lessons/webgl-image-processing-continued.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Image Processing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-image-processing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Indexed Vertices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-indexed-vertices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Optimization - Instanced Drawing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-instanced-drawing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Less Code, More Fun]]> https://webgl2fundamentals.org/webgl/lessons/webgl-less-code-more-fun.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Load Obj with Mtl]]> https://webgl2fundamentals.org/webgl/lessons/webgl-load-obj-w-mtl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Load Obj]]> https://webgl2fundamentals.org/webgl/lessons/webgl-load-obj.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Matrix Naming]]> https://webgl2fundamentals.org/webgl/lessons/webgl-matrix-naming.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Matrices vs Math Matrices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-matrix-vs-math.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Multiple Views, Multiple Canvases]]> https://webgl2fundamentals.org/webgl/lessons/webgl-multiple-views.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Picking]]> https://webgl2fundamentals.org/webgl/lessons/webgl-picking.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Planar and Perspective Projection Mapping]]> https://webgl2fundamentals.org/webgl/lessons/webgl-planar-projection-mapping.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Points, Lines, and Triangles]]> https://webgl2fundamentals.org/webgl/lessons/webgl-points-lines-triangles.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Precision Issues]]> https://webgl2fundamentals.org/webgl/lessons/webgl-precision-issues.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Pulling Vertices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-pulling-vertices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[A simple way to show the load on the GPU's vertex and fragment processing?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-a-simple-way-to-show-the-load-on-the-gpu-s-vertex-and-fragment-processing-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Accessing textures by pixel coordinate in WebGL2]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-accessing-textures-by-pixel-coordinate-in-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Apply a displacement map and specular map]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-apply-a-displacement-map-and-specular-map.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Can anyone explain what this GLSL fragment shader is doing?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-can-anyone-explain-what-this-glsl-fragment-shader-is-doing-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Can I mute the warning about vertex attrib 0 being disabled?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-can-i-mute-the-warning-about-vertex-attrib-0-being-disabled-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Create image warping effect in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-create-image-warping-effect-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Creating a smudge/liquify effect]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-creating-a-smudge-liquify-effect.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Determine min/max values for the entire image]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-determine-min-max-values-for-the-entire-image.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Don't blend a polygon that crosses itself]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-don-t-blend-a-polygon-that-crosses-itself.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing 2D image with depth map to achieve pseudo-3D effect]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-2d-image-with-depth-map-to-achieve-pseudo-3d-effect.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing a heightmap]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-a-heightmap.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing layers with different points]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-layers-with-different-points.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing Many different models in a single draw call]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-many-different-models-in-a-single-draw-call.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Drawing textured sprites with instanced drawing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-drawing-textured-sprites-with-instanced-drawing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Efficient particle system in javascript? (WebGL)]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-efficient-particle-system-in-javascript---webgl-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Emulating palette based graphics in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-emulating-palette-based-graphics-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[FPS-like camera movement with basic matrix transformations]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-fps-like-camera-movement-with-basic-matrix-transformations.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Get the size of a point for collision checking]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-get-the-size-of-a-point-for-collision-checking.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[GLSL shader to support coloring and texturing]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-glsl-shader-to-support-coloring-and-texturing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I compute for 500 points which of 1000 line segments is nearest to each point?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-compute-for-500-points-which-of-1000-line-segments-is-nearest-to-each-point-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I create a 16bit historgram of 16bit data]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-create-a-16bit-historgram-of-16bit-data.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I get all the uniforms and uniformBlocks]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-get-all-the-uniforms-and-uniformblocks.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How can I move the perspective vanishing point from the center of the canvas?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-can-i-move-the-perspective-vanishing-point-from-the-center-of-the-canvas-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to Achieve Moving Line with Trail Effects]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-achieve-moving-line-with-trail-effects.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to bind an array of textures to a WebGL shader uniform?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-bind-an-array-of-textures-to-a-webgl-shader-uniform-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to blend colors across 2 triangles]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-blend-colors-across-2-triangles.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to control the color between vertices]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-control-the-color-between-vertices.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to create a torus]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-create-a-torus.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to detect clipped triangles in the framgment shader]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-detect-clipped-triangles-in-the-framgment-shader.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to determine the average brightness in a scene?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-determine-the-average-brightness-in-a-scene-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to draw correctly textured trapezoid polygons]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-draw-correctly-textured-trapezoid-polygons.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to fade the drawing buffer]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-fade-the-drawing-buffer.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get audio data into a shader]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-audio-data-into-a-shader.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:30.595Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get code completion for WebGL in Visual Studio Code]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-code-completion-for-webgl-in-visual-studio-code.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get pixelize effect in webgl?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-pixelize-effect-in-webgl-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to get the 3d coordinates of a mouse click]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-get-the-3d-coordinates-of-a-mouse-click.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to implement zoom from mouse in 2D WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-implement-zoom-from-mouse-in-2d-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to import a heightmap in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-import-a-heightmap-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to load images in the background with no jank]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-load-images-in-the-background-with-no-jank.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to make a smudge brush tool]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-make-a-smudge-brush-tool.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to make WebGL canvas transparent]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-make-webgl-canvas-transparent.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to optimize rendering a UI]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-optimize-rendering-a-ui.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to prevent texture bleeding with a texture atlas]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-prevent-texture-bleeding-with-a-texture-atlas.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to process particle positions]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-process-particle-positions.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to read a single component with readPixels]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-read-a-single-component-with-readpixels.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to render large scale images like 32000x32000]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-render-large-scale-images-like-32000x32000.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to simulate a 3D texture in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-simulate-a-3d-texture-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to support both WebGL and WebGL2]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-support-both-webgl-and-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to tell if an image has an alpha channel]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-tell-if-an-image-has-an-alpha-channel.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use a 2d sprite's transparency as a mask]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-a-2d-sprite-s-transparency-as-a-mask.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use texture, and color also in WebGL?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-texture--and-color-also-in-webgl-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use textures as data]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-textures-as-data.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to use the stencil buffer]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-use-the-stencil-buffer.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[How to write a web-based music visualizer]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-how-to-write-a-web-based-music-visualizer.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[I get invalid type error when calling readPixels]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-i-get-invalid-type-error-when-calling-readpixels.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Is it possible to measure rendering time in webgl using gl.finish()?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-is-it-possible-to-measure-rendering-time-in-webgl-using-gl-finish---.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Is there the notion of a generalized vertex and fragment shader?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-is-there-the-notion-of-a-generalized-vertex-and-fragment-shader-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Optimize drawing lots of large images]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-optimize-drawing-lots-of-large-images.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Passing in per sprite alpha values when batching]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-passing-in-per-sprite-alpha-values-when-batching.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Pure WebGL Dashed Line]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-pure-webgl-dashed-line.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Recording FPS in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-recording-fps-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Rendering slowly over time]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-rendering-slowly-over-time.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Setting the values of a struct array from JS to GLSL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-setting-the-values-of-a-struct-array-from-js-to-glsl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Show a night view vs a day view on a 3D Earth sphere]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-show-a-night-view-vs-a-day-view-on-a-3d-earth-sphere.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Sorting and optimizing instanced rendering]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-sorting-and-optimizing-instanced-rendering.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Tex image TEXTURE_2D level 0 is incurring lazy initialization]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-tex-image-texture_2d-level-0-is-incurring-lazy-initialization.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[The fastest way to draw many circles]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-the-fastest-way-to-draw-many-circles.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL 2D tilemaps]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-webgl-2d-tilemaps.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL Droste effect]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-webgl-droste-effect.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[What is the local origin of a 3D model?]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-what-is-the-local-origin-of-a-3d-model-.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[When to choose highp, mediump, lowp in shaders]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-when-to-choose-highp--mediump--lowp-in-shaders.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Working around gl_PointSize limitations webGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-working-around-gl_pointsize-limitations-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Zooming to and stopping at object in a scene in WebGL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna-zooming-to-and-stopping-at-object-in-a-scene-in-webgl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Questions and Answers]]> https://webgl2fundamentals.org/webgl/lessons/webgl-qna.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 readPixels]]> https://webgl2fundamentals.org/webgl/lessons/webgl-readpixels.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[References]]> https://webgl2fundamentals.org/webgl/lessons/webgl-references.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Rendering to a Texture]]> https://webgl2fundamentals.org/webgl/lessons/webgl-render-to-texture.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Resizing the Canvas.]]> https://webgl2fundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 - Scene Graph]]> https://webgl2fundamentals.org/webgl/lessons/webgl-scene-graph.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Setup and Installation]]> https://webgl2fundamentals.org/webgl/lessons/webgl-setup-and-installation.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shaders and GLSL]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shaders-and-glsl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shadertoy]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shadertoy.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shadows Continued]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shadows-continued.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Shadows]]> https://webgl2fundamentals.org/webgl/lessons/webgl-shadows.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Skinning]]> https://webgl2fundamentals.org/webgl/lessons/webgl-skinning.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 SkyBox]]> https://webgl2fundamentals.org/webgl/lessons/webgl-skybox.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Smallest Programs]]> https://webgl2fundamentals.org/webgl/lessons/webgl-smallest-programs.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Sprites]]> https://webgl2fundamentals.org/webgl/lessons/webgl-sprites.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 State Diagram]]> https://webgl2fundamentals.org/webgl/lessons/webgl-state-diagram.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - Canvas 2D]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-canvas2d.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - Using a Glyph Texture]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-glyphs.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - HTML]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-html.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Text - Textures]]> https://webgl2fundamentals.org/webgl/lessons/webgl-text-texture.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Texture Units]]> https://webgl2fundamentals.org/webgl/lessons/webgl-texture-units.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Tips]]> https://webgl2fundamentals.org/webgl/lessons/webgl-tips.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 Visualizing the Camera]]> https://webgl2fundamentals.org/webgl/lessons/webgl-visualizing-the-camera.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Differences from WebGLFundamentals.org]]> https://webgl2fundamentals.org/webgl/lessons/webgl1-to-webgl2-fundamentals.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 from WebGL1]]> https://webgl2fundamentals.org/webgl/lessons/webgl1-to-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2 What's New]]> https://webgl2fundamentals.org/webgl/lessons/webgl2-whats-new.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z \ No newline at end of file diff --git a/webgl/lessons/de/atom.xml b/webgl/lessons/de/atom.xml index 4262ef1e..87673807 100644 --- a/webgl/lessons/de/atom.xml +++ b/webgl/lessons/de/atom.xml @@ -2,7 +2,7 @@ Grundlagen WebGL2 - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z https://github.com/jpmonette/feed WebGL2Fundamentals Contributors @@ -15,22 +15,22 @@ <![CDATA[Wie benutzt man WebGL2]]> https://webgl2fundamentals.org/webgl/lessons/de/webgl-getting-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[Unterschiede zu WebGLFundamentals.org]]> https://webgl2fundamentals.org/webgl/lessons/de/webgl1-to-webgl2-fundamentals.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z \ No newline at end of file diff --git a/webgl/lessons/ja/atom.xml b/webgl/lessons/ja/atom.xml index 767275a1..c2338bea 100644 --- a/webgl/lessons/ja/atom.xml +++ b/webgl/lessons/ja/atom.xml @@ -2,7 +2,7 @@ WebGL2の基本 - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z https://github.com/jpmonette/feed WebGL2Fundamentals Contributors @@ -15,99 +15,99 @@ <![CDATA[WebGL2の基本]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl-fundamentals.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2の使い方]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl-getting-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGLの仕組み]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl-how-it-works.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2における画像処理の続き]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl-image-processing-continued.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2における画像処理]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl-image-processing.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGLシェーダーとGLSL]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl-shaders-and-glsl.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGLFundamentals.orgとの違い]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl1-to-webgl2-fundamentals.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL1からWebGL2への移行]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl1-to-webgl2.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z <![CDATA[WebGL2の新機能]]> https://webgl2fundamentals.org/webgl/lessons/ja/webgl2-whats-new.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z WebGL2Fundamentals Contributors https://webgl2fundamentals.org/contributors.html - 2025-01-15T04:14:30.000Z + 2025-01-15T04:49:01.000Z \ No newline at end of file diff --git a/webgl/lessons/ja/webgl-how-it-works.html b/webgl/lessons/ja/webgl-how-it-works.html index f7c2c871..bef4f3be 100644 --- a/webgl/lessons/ja/webgl-how-it-works.html +++ b/webgl/lessons/ja/webgl-how-it-works.html @@ -542,11 +542,11 @@

実際にコーディングしてみましょう。データの取り出し方を指定する部分は以下のコードになります。

-  var size = 4;
-*  var type = gl.UNSIGNED_BYTE;
-*  var normalize = true;
-  var stride = 0;
-  var offset = 0;
+  var size = 4;
+*  var type = gl.UNSIGNED_BYTE;
+*  var normalize = true;
+  var stride = 0;
+  var offset = 0;
   gl.vertexAttribPointer(colorLocation, size, type, normalize, stride, offset);
 

バッファを色で塗りつぶす時は次のようにします。

@@ -555,24 +555,25 @@

バ // that make the rectangle. function setColors(gl) { // Pick 2 random colors. - var r1 = Math.random() * 256; // 0 to 255.99999 - var b1 = Math.random() * 256; // these values - var g1 = Math.random() * 256; // will be truncated - var r2 = Math.random() * 256; // when stored in the - var b2 = Math.random() * 256; // Uint8Array - var g2 = Math.random() * 256; -

gl.bufferData( -gl.ARRAY_BUFFER, -new Uint8Array( // Uint8Array -[ r1, b1, g1, 255, -r1, b1, g1, 255, -r1, b1, g1, 255, -r2, b2, g2, 255, -r2, b2, g2, 255, -r2, b2, g2, 255]), -gl.STATIC_DRAW); + var r1 = Math.random() * 256; // 0 to 255.99999 + var b1 = Math.random() * 256; // these values + var g1 = Math.random() * 256; // will be truncated + var r2 = Math.random() * 256; // when stored in the + var b2 = Math.random() * 256; // Uint8Array + var g2 = Math.random() * 256; + + gl.bufferData( + gl.ARRAY_BUFFER, + new Uint8Array( // Uint8Array + [ r1, b1, g1, 255, + r1, b1, g1, 255, + r1, b1, g1, 255, + r2, b2, g2, 255, + r2, b2, g2, 255, + r2, b2, g2, 255]), + gl.STATIC_DRAW); } -

+

実行結果はこのようになります。

diff --git a/webgl/lessons/ja/webgl1-to-webgl2.html b/webgl/lessons/ja/webgl1-to-webgl2.html index 108ab2cb..5862438c 100644 --- a/webgl/lessons/ja/webgl1-to-webgl2.html +++ b/webgl/lessons/ja/webgl1-to-webgl2.html @@ -541,48 +541,49 @@

WebGL1の拡張機能をWebGL2のように見せる

1つの回避策は、初期化時にWebGL1の拡張機能をWebGLコンテキストにコピーする事です。そうすると残りのコードをそのままにできます。以下が例です。

-const gl = someCanvas.getContext("webgl");
-const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object");
-

function getAndApplyExtension(gl, name) { -const ext = gl.getExtension(name); -if (!ext) { -return null; -} -const fnSuffix = name.split("")[0]; -const enumSuffix = '’ + fnSuffix; -for (const key in ext) { -const value = ext[key]; -const isFunc = typeof (value) === ‘function’; -const suffix = isFunc ? fnSuffix : enumSuffix; -let name = key; -// examples of where this is not true are WEBGL_compressed_texture_s3tc -// and WEBGL_compressed_texture_pvrtc -if (key.endsWith(suffix)) { -name = key.substring(0, key.length - suffix.length); -} -if (gl[name] !== undefined) { -if (!isFunc && gl[name] !== value) { -console.warn(“conflict:”, name, gl[name], value, key); -} -} else { -if (isFunc) { -gl[name] = function(origFn) { -return function() { -return origFn.apply(ext, arguments); -}; -}(value); -} else { -gl[name] = value; -} -} -} -return ext; +const gl = someCanvas.getContext("webgl"); +const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object"); + +function getAndApplyExtension(gl, name) { + const ext = gl.getExtension(name); + if (!ext) { + return null; + } + const fnSuffix = name.split("_")[0]; + const enumSuffix = '_' + fnSuffix; + for (const key in ext) { + const value = ext[key]; + const isFunc = typeof (value) === 'function'; + const suffix = isFunc ? fnSuffix : enumSuffix; + let name = key; + // examples of where this is not true are WEBGL_compressed_texture_s3tc + // and WEBGL_compressed_texture_pvrtc + if (key.endsWith(suffix)) { + name = key.substring(0, key.length - suffix.length); + } + if (gl[name] !== undefined) { + if (!isFunc && gl[name] !== value) { + console.warn("conflict:", name, gl[name], value, key); + } + } else { + if (isFunc) { + gl[name] = function(origFn) { + return function() { + return origFn.apply(ext, arguments); + }; + }(value); + } else { + gl[name] = value; + } + } + } + return ext; } -

+

コードが両方で同じように動作するようになりました。例:

 if (haveVAOs) {
-  var someVAO = gl.createVertexArray();
+  var someVAO = gl.createVertexArray();
   ...
 } else {
   ... do whatever for no VAOs.
@@ -592,9 +593,9 @@ 

WebGL1の拡張機能をWebGL2のように見せる

 if (haveVAOs) {
   if (isWebGL2)
-     someVAO = gl.createVertexArray();
+     someVAO = gl.createVertexArray();
   } else {
-     someVAO = vaoExt.createVertexArrayOES();
+     someVAO = vaoExt.createVertexArrayOES();
   }
   ...
 } else {
diff --git a/webgl/lessons/ko/atom.xml b/webgl/lessons/ko/atom.xml
index 2540bd7d..f5d5baa2 100644
--- a/webgl/lessons/ko/atom.xml
+++ b/webgl/lessons/ko/atom.xml
@@ -2,7 +2,7 @@
 
     
     WebGL2 기초
-    2025-01-15T04:14:30.000Z
+    2025-01-15T04:49:01.000Z
     https://github.com/jpmonette/feed
     
         WebGL2Fundamentals Contributors
@@ -15,682 +15,682 @@
         <![CDATA[WebGL2 두개 이상의 텍스처 사용하기]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2-textures.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 DrawImage 구현]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2d-drawimage.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 2D 행렬]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2d-matrices.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 행렬 스택 구현]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2d-matrix-stack.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 2D 회전]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2d-rotation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 2D 크기 변환]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2d-scale.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 2D 이동]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2d-translation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 래스터라이징 vs 3D 라이브러리]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-2d-vs-3d-library.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL 3D - 카메라]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-camera.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 3D - 방향성 조명 효과(Directional Lighting)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-lighting-directional.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 3D - 점 조명 효과(Point Lighting)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-lighting-point.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 3D - 스팟 조명 효과(Spot Lighting)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-lighting-spot.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 3D 직교 투영]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-orthographic.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 3D 원근 교정 텍스처 매핑]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-perspective-correct-texturemapping.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL 3D 원근 투영]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-perspective.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 텍스처]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-3d-textures.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 알파(Alpha)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-and-alpha.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 애니메이션]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-animation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 안티패턴]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-anti-patterns.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Attributes]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-attributes.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 보일러플레이트(Boilerplate)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-boilerplate.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 교차 출처 이미지(Cross Origin Image)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-cors-permission.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Cross Platform 문제]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-cross-platform-issues.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 큐브맵(Cubemap)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-cube-maps.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 3D - 데이터 텍스처]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-data-textures.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 여러 물체를 그리는 법]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-drawing-multiple-things.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 환경맵 (반사)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-environment-maps.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Framebuffer]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-framebuffers.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 기초]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-fundamentals.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 사용법]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-getting-webgl2.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 GPGPU]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-gpgpu.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 작동 원리]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-how-it-works.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 이미지 처리 심화]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-image-processing-continued.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 이미지 처리]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-image-processing.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 정점 인덱스]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-indexed-vertices.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 최적화 - 인스턴스 드로잉(Instanced Drawing)]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-instanced-drawing.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 더 적은 코드로 즐겁게 코딩하기]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-less-code-more-fun.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Obj 로딩]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-load-obj.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 행렬의 이름]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-matrix-naming.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 행렬 vs 수학에서의 행렬]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-matrix-vs-math.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 평면 및 원근 투영 매핑]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-planar-projection-mapping.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 점, 선, 삼각형]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-points-lines-triangles.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 정밀도 이슈]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-precision-issues.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[질문 및 답변]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-qna.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 readPixels]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-readpixels.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[참고 자료]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-references.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 텍스처에 렌더링하기]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-render-to-texture.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Canvas 리사이징.]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-resizing-the-canvas.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 장면(Scene) 그래프]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-scene-graph.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 설정 및 설치]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-setup-and-installation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 셰이더와 GLSL]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-shaders-and-glsl.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 그림자]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-shadows.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 SkyBox]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-skybox.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Sprite]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-sprites.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 텍스트 - Canvas 2D]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-text-canvas2d.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 텍스트 - HTML]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-text-html.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 텍스트 - 텍스처]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-text-texture.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 텍스처 유닛]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-texture-units.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Tip]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl-tips.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGLFundamentals.org과 다른 점]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl1-to-webgl2-fundamentals.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL1에서 WebGL2로의 변경]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl1-to-webgl2.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 새로운 기능]]>
         https://webgl2fundamentals.org/webgl/lessons/ko/webgl2-whats-new.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
 
\ No newline at end of file
diff --git a/webgl/lessons/ko/webgl-2d-drawimage.html b/webgl/lessons/ko/webgl-2d-drawimage.html
index f2568dbb..3125f950 100644
--- a/webgl/lessons/ko/webgl-2d-drawimage.html
+++ b/webgl/lessons/ko/webgl-2d-drawimage.html
@@ -698,16 +698,17 @@ 

사소한 최적화

#version 300 es in vec4 a_position; -in vec2 a_texcoord; -

uniform mat4 u_matrix; -uniform mat4 u_textureMatrix;

-

out vec2 v_texcoord;

-

void main() { -gl_Position = u_matrix * a_position;

-
    -
  • v_texcoord = (u_textureMatrix * a_position).xy; + +uniform mat4 u_matrix; +uniform mat4 u_textureMatrix; + +out vec2 v_texcoord; + +void main() { + gl_Position = u_matrix * a_position; +* v_texcoord = (u_textureMatrix * a_position).xy; } -
- +

이제 텍스쳐 좌표를 설정하는 코드를 삭제해도 됩니다. 삭제하더라도 이전과 완전히 동일하게 동작할 것입니다.

diff --git a/webgl/lessons/ko/webgl-2d-vs-3d-library.html b/webgl/lessons/ko/webgl-2d-vs-3d-library.html index d43c019f..911d2f27 100644 --- a/webgl/lessons/ko/webgl-2d-vs-3d-library.html +++ b/webgl/lessons/ko/webgl-2d-vs-3d-library.html @@ -256,21 +256,21 @@

WebGL2 - 래스터라이징 vs 3D 라이브러리

three.js를 사용하는 경우 코드는 아래와 같습니다.

   // 설정
-  renderer = new THREE.WebGLRenderer({canvas: document.querySelector("#canvas")});
+  renderer = new THREE.WebGLRenderer({canvas: document.querySelector("#canvas")});
   c.appendChild(renderer.domElement);
 
   // 카메라를 생성하고 설정
-  camera = new THREE.PerspectiveCamera(70, 1, 1, 1000);
-  camera.position.z = 400;
+  camera = new THREE.PerspectiveCamera(70, 1, 1, 1000);
+  camera.position.z = 400;
 
   // 장면 생성
-  scene = new THREE.Scene();
+  scene = new THREE.Scene();
 
   // 육면체 생성
-  var geometry = new THREE.BoxGeometry(200, 200, 200);
+  var geometry = new THREE.BoxGeometry(200, 200, 200);
 
   // 머티리얼 생성
-  var material = new THREE.MeshPhongMaterial({
+  var material = new THREE.MeshPhongMaterial({
     ambient: 0x555555,
     color: 0x555555,
     specular: 0xffffff,
@@ -279,15 +279,15 @@ 

WebGL2 - 래스터라이징 vs 3D 라이브러리

}); // geometry와 머티리얼로 메쉬 생성 - mesh = new THREE.Mesh(geometry, material); + mesh = new THREE.Mesh(geometry, material); scene.add(mesh); // 2개의 조명 생성 - light1 = new THREE.PointLight(0xff0040, 2, 0); + light1 = new THREE.PointLight(0xff0040, 2, 0); light1.position.set(200, 100, 300); scene.add(light1); - light2 = new THREE.PointLight(0x0040ff, 2, 0); + light2 = new THREE.PointLight(0x0040ff, 2, 0); light2.position.set(-200, 100, 300); scene.add(light2);
@@ -316,10 +316,10 @@

WebGL2 - 래스터라이징 vs 3D 라이브러리

// 조명 2개 정의 glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); - float light0_position[] = { 200, 100, 300, }; - float light1_position[] = { -200, 100, 300, }; - float light0_color[] = { 1, 0, 0.25, 1, }; - float light1_color[] = { 0, 0.25, 1, 1, }; + float light0_position[] = { 200, 100, 300, }; + float light1_position[] = { -200, 100, 300, }; + float light0_color[] = { 1, 0, 0.25, 1, }; + float light1_color[] = { 0, 0.25, 1, 1, }; glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_color); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_color); glLightfv(GL_LIGHT0, GL_POSITION, light0_position); @@ -327,12 +327,12 @@

WebGL2 - 래스터라이징 vs 3D 라이브러리

... // 육면체 그리기 - static int count = 0; + static int count = 0; ++count; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); - double angle = count * 0.1; + double angle = count * 0.1; glTranslatef(0, 0, -400); glRotatef(angle, 0, 1, 0); diff --git a/webgl/lessons/ko/webgl-3d-orthographic.html b/webgl/lessons/ko/webgl-3d-orthographic.html index 3a75c404..849b8a91 100644 --- a/webgl/lessons/ko/webgl-3d-orthographic.html +++ b/webgl/lessons/ko/webgl-3d-orthographic.html @@ -801,23 +801,24 @@

attribute는 vec4인데 왜 gl.vertexAttribPointer의 size는 3인가요?둘 다 'vec4'지만, 우리가 버퍼에서 데이터를 가져오는 방법을 WebGL에 알려줄 때에는 아래와 같이 정의하였습니다.

 // attribute에게 positionBuffer (ARRAY_BUFFER)로부터 데이터를 가져오는 법을 알려줍니다. 
-var size = 3;          // iteration마다 3 개의 component
-var type = gl.FLOAT;   // 데이터는 32bit floats
-var normalize = false; // 데이터를 정규화하지 않음
-var stride = 0;        // 0 = 각 iteration마다 다음 위치값을 얻기 위해 size * sizeof(type) 만큼 앞으로 이동
-var offset = 0;        // 버퍼의 맨 앞부분부터 시작
+var size = 3;          // iteration마다 3 개의 component
+var type = gl.FLOAT;   // 데이터는 32bit floats
+var normalize = false; // 데이터를 정규화하지 않음
+var stride = 0;        // 0 = 각 iteration마다 다음 위치값을 얻기 위해 size * sizeof(type) 만큼 앞으로 이동
+var offset = 0;        // 버퍼의 맨 앞부분부터 시작
 gl.vertexAttribPointer(
     positionAttributeLocation, size, type, normalize, stride, offset);
-

… -// attribute에게 colorBuffer (ARRAY_BUFFER)로부터 데이터를 가져오는 법을 알려줍니다. -var size = 3; // iteration마다 3개의 component -var type = gl.UNSIGNED_BYTE; // 데이터는 8bit unsigned bytes -var normalize = true; // 0-255 범위에서 0.0-1.0 범위로 변환 -var stride = 0; // 0 = 각 iteration마다 다음 색상값을 얻기 위해 size * sizeof(type) 만큼 앞으로 이동 -var offset = 0; // 버퍼의 맨 앞부분부터 시작 + +... +// attribute에게 colorBuffer (ARRAY_BUFFER)로부터 데이터를 가져오는 법을 알려줍니다. +var size = 3; // iteration마다 3개의 component +var type = gl.UNSIGNED_BYTE; // 데이터는 8bit unsigned bytes +var normalize = true; // 0-255 범위에서 0.0-1.0 범위로 변환 +var stride = 0; // 0 = 각 iteration마다 다음 색상값을 얻기 위해 size * sizeof(type) 만큼 앞으로 이동 +var offset = 0; // 버퍼의 맨 앞부분부터 시작 gl.vertexAttribPointer( -colorAttributeLocation, size, type, normalize, stride, offset); -

+ colorAttributeLocation, size, type, normalize, stride, offset); +

위에 써있는 '3'들은 버퍼에서 iteration마다, attribute마다 3개의 값을 가져오라는 뜻입니다. 이래도 되는 이유는 WebGL의 정점 쉐이더는 입력하지 않는 값에 대해 기본값을 사용하기 때문입니다. diff --git a/webgl/lessons/ko/webgl-how-it-works.html b/webgl/lessons/ko/webgl-how-it-works.html index 2df0a22f..0f7714ba 100644 --- a/webgl/lessons/ko/webgl-how-it-works.html +++ b/webgl/lessons/ko/webgl-how-it-works.html @@ -488,11 +488,11 @@

WebGL2 작동 원리

이를 위해 코드를 변경해 보겠습니다. WebGL에게 우리가 사용할 색상을 가져오는 방법을 알려줄 때,

-  var size = 4;
-*  var type = gl.UNSIGNED_BYTE;
-*  var normalize = true;
-  var stride = 0;
-  var offset = 0;
+  var size = 4;
+*  var type = gl.UNSIGNED_BYTE;
+*  var normalize = true;
+  var stride = 0;
+  var offset = 0;
   gl.vertexAttribPointer(colorLocation, size, type, normalize, stride, offset);
 

그 다음 버퍼를 사용할 색상으로 채울때 입니다.

@@ -500,24 +500,25 @@

WebGL2 작동 원리

// 사각형을 구성하는 두 개의 삼각형의 색상으로 버퍼를 채움 function setColors(gl) { // 2 개의 랜덤 색상 선택 - var r1 = Math.random() * 256; // 0 에서 255.99999 사이의 값. - var b1 = Math.random() * 256; // 이 값들은 - var g1 = Math.random() * 256; // Uint8Array에 저장될 때 - var r2 = Math.random() * 256; // 절단이 발생함 - var b2 = Math.random() * 256; - var g2 = Math.random() * 256; -

gl.bufferData( -gl.ARRAY_BUFFER, -new Uint8Array( // Uint8Array -[ r1, b1, g1, 255, -r1, b1, g1, 255, -r1, b1, g1, 255, -r2, b2, g2, 255, -r2, b2, g2, 255, -r2, b2, g2, 255]), -gl.STATIC_DRAW); + var r1 = Math.random() * 256; // 0 에서 255.99999 사이의 값. + var b1 = Math.random() * 256; // 이 값들은 + var g1 = Math.random() * 256; // Uint8Array에 저장될 때 + var r2 = Math.random() * 256; // 절단이 발생함 + var b2 = Math.random() * 256; + var g2 = Math.random() * 256; + + gl.bufferData( + gl.ARRAY_BUFFER, + new Uint8Array( // Uint8Array + [ r1, b1, g1, 255, + r1, b1, g1, 255, + r1, b1, g1, 255, + r2, b2, g2, 255, + r2, b2, g2, 255, + r2, b2, g2, 255]), + gl.STATIC_DRAW); } -

+

아래는 결과 예제입니다.

diff --git a/webgl/lessons/ko/webgl-less-code-more-fun.html b/webgl/lessons/ko/webgl-less-code-more-fun.html index 171495c8..bb0ab2a3 100644 --- a/webgl/lessons/ko/webgl-less-code-more-fun.html +++ b/webgl/lessons/ko/webgl-less-code-more-fun.html @@ -657,10 +657,11 @@

setter들을 직접 호출해서 사용해도 되나요?

 // 초기화 시점에
-var uniformSetters = twgl.createUniformSetters(program);
-

// 그리는 시점에 +var uniformSetters = twgl.createUniformSetters(program); + +// 그리는 시점에 uniformSetters.u_ambient([1, 0, 0, 1]); // ambient color를 빨간색으로 설정. -

+

이렇게 하는것이 좋지 않은 이유는 GLSL 프로그램을 작성할 때 셰이더를 변경하는 경우가 종종 생긴다는 겁니다. 주로 디버깅 목적으로요. 예를들어 프로그램을 사용했더니 화면에 아무것도 보이지 않는다고 합시다. 저같은 경우 이렇게 아무것도 나타나지 않을때 때 제일 먼저 하는 작업은 셰이더를 단순화 하는 것입니다. @@ -669,41 +670,44 @@

setter들을 직접 호출해서 사용해도 되나요?

 #version 300 es
 precision highp float;
-

in vec4 v_position; + +in vec4 v_position; in vec2 v_texCoord; in vec3 v_normal; in vec3 v_surfaceToLight; -in vec3 v_surfaceToView;

-

uniform vec4 u_lightColor; +in vec3 v_surfaceToView; + +uniform vec4 u_lightColor; uniform vec4 u_ambient; uniform sampler2D u_diffuse; uniform vec4 u_specular; uniform float u_shininess; -uniform float u_specularFactor;

-

out vec4 outColor;

-

vec4 lit(float l ,float h, float m) { -return vec4(1.0, -max(l, 0.0), -(l > 0.0) ? pow(max(0.0, h), m) : 0.0, -1.0); -}

-

void main() { -vec4 diffuseColor = texture2D(u_diffuse, v_texCoord); -vec3 a_normal = normalize(v_normal); -vec3 surfaceToLight = normalize(v_surfaceToLight); -vec3 surfaceToView = normalize(v_surfaceToView); -vec3 halfVector = normalize(surfaceToLight + surfaceToView); -vec4 litR = lit(dot(a_normal, surfaceToLight), -dot(a_normal, halfVector), u_shininess); -vec4 outColor = vec4(( -u_lightColor * (diffuseColor * litR.y + diffuseColor * u_ambient + -u_specular * litR.z * u_specularFactor)).rgb, -diffuseColor.a);

-
- + +void main() { + vec4 diffuseColor = texture2D(u_diffuse, v_texCoord); + vec3 a_normal = normalize(v_normal); + vec3 surfaceToLight = normalize(v_surfaceToLight); + vec3 surfaceToView = normalize(v_surfaceToView); + vec3 halfVector = normalize(surfaceToLight + surfaceToView); + vec4 litR = lit(dot(a_normal, surfaceToLight), + dot(a_normal, halfVector), u_shininess); + vec4 outColor = vec4(( + u_lightColor * (diffuseColor * litR.y + diffuseColor * u_ambient + + u_specular * litR.z * u_specularFactor)).rgb, + diffuseColor.a); +* outColor = vec4(0,1,0,1); // &lt;!--- 단순한 초록색으로 +} +

outColor를 단색으로 설정하는 라인을 추가한 것에 주목하세요. 대부분의 드라이버는 위쪽 라인의 코드들이 최종 결과에 영향을 주지 않는다는 것을 알아냅니다. 그래서 모든 uniform들을 최적화합니다. 프로그램을 다시 실행하여 twgl.createUniformSetters를 호출하면 u_ambient를 위한 setter를 생성하지 못하고 위 코드에서 uniformSetters.u_ambient()를 호출하는 부분이 실패하면서 아래와 같은 메시지가 나타납니다. diff --git a/webgl/lessons/ko/webgl-planar-projection-mapping.html b/webgl/lessons/ko/webgl-planar-projection-mapping.html index a8f76c5a..e74c2e8a 100644 --- a/webgl/lessons/ko/webgl-planar-projection-mapping.html +++ b/webgl/lessons/ko/webgl-planar-projection-mapping.html @@ -908,17 +908,18 @@

WebGL2 평면 및 원근 투영 매핑

조건부 텍스처 참조

위의 프래그먼트 셰이더에서는 항상 두 개의 텍스처를 모두 읽게 됩니다.


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

float projectedAmount = inRange ? 1.0 : 0.0; -gl_FragColor = mix(texColor, projectedTexColor, projectedAmount); -

+ vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + + float projectedAmount = inRange ? 1.0 : 0.0; + gl_FragColor = mix(texColor, projectedTexColor, projectedAmount); +

왜 아래와 같이 하지 않았을까요?


   if (inRange) {
-    gl_FragColor = texture(u_projectedTexture, projectedTexcoord.xy);
+    gl_FragColor = texture(u_projectedTexture, projectedTexcoord.xy);
   } else {
-    gl_FragColor = texture(u_texture, v_texcoord) * u_colorMult;
+    gl_FragColor = texture(u_texture, v_texcoord) * u_colorMult;
   }
 

GLSL ES 3.0 명세의 Section 8.8에 따르면

@@ -934,20 +935,22 @@

Texture Lookup Functions

결과를 조건부로 사용할 수는 있습니다. 예를 들어 아래와 같이 작성하거나


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

if (inRange) { -gl_FragColor = projectedTexColor; -} else { -gl_FragColor = texColor; -} -

+ vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + + if (inRange) { + gl_FragColor = projectedTexColor; + } else { + gl_FragColor = texColor; + } +

아래와 같이 작성할 수 있습니다.


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

gl_FragColor = inRange ? projectedTexColor : texColor; -

+ vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + + gl_FragColor = inRange ? projectedTexColor : texColor; +

하지만 텍스처 접근 자체를 조건부로 만들 수는 없습니다. 어떤 GPU에서는 작동될 수 있지만 모든 GPU에서 작동이 보장되지는 않습니다. diff --git a/webgl/lessons/ko/webgl1-to-webgl2.html b/webgl/lessons/ko/webgl1-to-webgl2.html index 9bca775e..68ebdfc6 100644 --- a/webgl/lessons/ko/webgl1-to-webgl2.html +++ b/webgl/lessons/ko/webgl1-to-webgl2.html @@ -542,11 +542,11 @@

Vertex Array Objects

WebGL1 extension을 WebGL2처럼 만들기

WebGL1의 extension에 있던 함수들은, WebGL2에서는 extension 없이 사용할 수 있습니다. 예를 들면, WebGL1에서는 아래와 같았지만

-var ext = gl.getExtension("OES_vertex_array_object");
+var ext = gl.getExtension("OES_vertex_array_object");
 if (!ext) {
-  // tell user they don't have the required extension or work around it
+  // tell user they don't have the required extension or work around it
 } else {
-  var someVAO = ext.createVertexArrayOES();
+  var someVAO = ext.createVertexArrayOES();
 }
 

@@ -560,48 +560,49 @@

WebGL1 extension을 WebGL2처럼 만들기

한 가지 해결 방법은, 초기화할 때 WebGL1 extension을 WebGL context에 복사하는 것입니다. 그렇게 하면 나머지 코드는 그대로입니다. 예시:

-const gl = someCanvas.getContext("webgl");
-const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object");
-

function getAndApplyExtension(gl, name) { -const ext = gl.getExtension(name); -if (!ext) { -return null; -} -const fnSuffix = name.split("")[0]; -const enumSuffix = '’ + fnSuffix; -for (const key in ext) { -const value = ext[key]; -const isFunc = typeof (value) === ‘function’; -const suffix = isFunc ? fnSuffix : enumSuffix; -let name = key; -// examples of where this is not true are WEBGL_compressed_texture_s3tc -// and WEBGL_compressed_texture_pvrtc -if (key.endsWith(suffix)) { -name = key.substring(0, key.length - suffix.length); -} -if (gl[name] !== undefined) { -if (!isFunc && gl[name] !== value) { -console.warn(“conflict:”, name, gl[name], value, key); -} -} else { -if (isFunc) { -gl[name] = function(origFn) { -return function() { -return origFn.apply(ext, arguments); -}; -}(value); -} else { -gl[name] = value; -} -} -} -return ext; +const gl = someCanvas.getContext("webgl"); +const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object"); + +function getAndApplyExtension(gl, name) { + const ext = gl.getExtension(name); + if (!ext) { + return null; + } + const fnSuffix = name.split("_")[0]; + const enumSuffix = '_' + fnSuffix; + for (const key in ext) { + const value = ext[key]; + const isFunc = typeof (value) === 'function'; + const suffix = isFunc ? fnSuffix : enumSuffix; + let name = key; + // examples of where this is not true are WEBGL_compressed_texture_s3tc + // and WEBGL_compressed_texture_pvrtc + if (key.endsWith(suffix)) { + name = key.substring(0, key.length - suffix.length); + } + if (gl[name] !== undefined) { + if (!isFunc && gl[name] !== value) { + console.warn("conflict:", name, gl[name], value, key); + } + } else { + if (isFunc) { + gl[name] = function(origFn) { + return function() { + return origFn.apply(ext, arguments); + }; + }(value); + } else { + gl[name] = value; + } + } + } + return ext; } -

+

이제 이 코드는 WebGL1과 WebGL2 에서 대부분 똑같이 동작할 겁니다. 예시:

 if (haveVAOs) {
-  var someVAO = gl.createVertexArray();
+  var someVAO = gl.createVertexArray();
   ...
 } else {
   ... do whatever for no VAOs.
@@ -611,9 +612,9 @@ 

WebGL1 extension을 WebGL2처럼 만들기

 if (haveVAOs) {
   if (isWebGL2)
-     someVAO = gl.createVertexArray();
+     someVAO = gl.createVertexArray();
   } else {
-     someVAO = vaoExt.createVertexArrayOES();
+     someVAO = vaoExt.createVertexArrayOES();
   }
   ...
 } else {
diff --git a/webgl/lessons/pt-br/atom.xml b/webgl/lessons/pt-br/atom.xml
index 58bbd024..7618f689 100644
--- a/webgl/lessons/pt-br/atom.xml
+++ b/webgl/lessons/pt-br/atom.xml
@@ -2,7 +2,7 @@
 
     
     Fundamentos da WebGL2
-    2025-01-15T04:14:30.000Z
+    2025-01-15T04:49:01.000Z
     https://github.com/jpmonette/feed
     
         WebGL2Fundamentals Contributors
@@ -15,198 +15,198 @@
         <![CDATA[Rotação 2D - WebGL]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-2d-rotation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Escala 2D WebGL]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-2d-scale.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Translação 2D WebGL2]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-2d-translation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - Rasterização vs Bibliotecas 3D]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-2d-vs-3d-library.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Alfa e a WebGL]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-and-alpha.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - Animção]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-animation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - Cross Origin Images]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-cors-permission.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Fundamentos da WebGL2]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-fundamentals.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Como usar a WebGL2]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-getting-webgl2.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Processamento de Imagem Continuada WebGL2]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-image-processing-continued.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Processamento de imagem WebGL2]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-image-processing.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Nomenclaturas das Matrizes WebGL]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-matrix-naming.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Configuração e Instalação da WebGL]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-setup-and-installation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Texto - Canvas 2D WebGL]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-text-canvas2d.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Texto - HTML]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl-text-html.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[Diferenças da WebGL2Fundamentals.org]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl1-to-webgl2-fundamentals.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 para a WebGL1]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl1-to-webgl2.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 O que há de novo]]>
         https://webgl2fundamentals.org/webgl/lessons/pt-br/webgl2-whats-new.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
 
\ No newline at end of file
diff --git a/webgl/lessons/pt-br/webgl-2d-vs-3d-library.html b/webgl/lessons/pt-br/webgl-2d-vs-3d-library.html
index 34ec1469..7c2d90f8 100644
--- a/webgl/lessons/pt-br/webgl-2d-vs-3d-library.html
+++ b/webgl/lessons/pt-br/webgl-2d-vs-3d-library.html
@@ -262,21 +262,21 @@ 

WebGL2 - Rasterização vs Bibliotecas 3D

Aqui está o código em three.js para fazer isso

   // Setup.
-  renderer = new THREE.WebGLRenderer({canvas: document.querySelector("#canvas")});
+  renderer = new THREE.WebGLRenderer({canvas: document.querySelector("#canvas")});
   c.appendChild(renderer.domElement);
 
   // Make and setup a camera.
-  camera = new THREE.PerspectiveCamera(70, 1, 1, 1000);
-  camera.position.z = 400;
+  camera = new THREE.PerspectiveCamera(70, 1, 1, 1000);
+  camera.position.z = 400;
 
   // Make a scene
-  scene = new THREE.Scene();
+  scene = new THREE.Scene();
 
   // Make a cube.
-  var geometry = new THREE.BoxGeometry(200, 200, 200);
+  var geometry = new THREE.BoxGeometry(200, 200, 200);
 
   // Make a material
-  var material = new THREE.MeshPhongMaterial({
+  var material = new THREE.MeshPhongMaterial({
     ambient: 0x555555,
     color: 0x555555,
     specular: 0xffffff,
@@ -285,15 +285,15 @@ 

WebGL2 - Rasterização vs Bibliotecas 3D

}); // Create a mesh based on the geometry and material - mesh = new THREE.Mesh(geometry, material); + mesh = new THREE.Mesh(geometry, material); scene.add(mesh); // Add 2 lights. - light1 = new THREE.PointLight(0xff0040, 2, 0); + light1 = new THREE.PointLight(0xff0040, 2, 0); light1.position.set(200, 100, 300); scene.add(light1); - light2 = new THREE.PointLight(0x0040ff, 2, 0); + light2 = new THREE.PointLight(0x0040ff, 2, 0); light2.position.set(-200, 100, 300); scene.add(light2);
@@ -322,10 +322,10 @@

WebGL2 - Rasterização vs Bibliotecas 3D

// Setup 2 lights glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); - float light0_position[] = { 200, 100, 300, }; - float light1_position[] = { -200, 100, 300, }; - float light0_color[] = { 1, 0, 0.25, 1, }; - float light1_color[] = { 0, 0.25, 1, 1, }; + float light0_position[] = { 200, 100, 300, }; + float light1_position[] = { -200, 100, 300, }; + float light0_color[] = { 1, 0, 0.25, 1, }; + float light1_color[] = { 0, 0.25, 1, 1, }; glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_color); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_color); glLightfv(GL_LIGHT0, GL_POSITION, light0_position); @@ -333,12 +333,12 @@

WebGL2 - Rasterização vs Bibliotecas 3D

... // Draw a cube. - static int count = 0; + static int count = 0; ++count; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); - double angle = count * 0.1; + double angle = count * 0.1; glTranslatef(0, 0, -400); glRotatef(angle, 0, 1, 0); diff --git a/webgl/lessons/pt-br/webgl1-to-webgl2.html b/webgl/lessons/pt-br/webgl1-to-webgl2.html index 72c531af..b0b38213 100644 --- a/webgl/lessons/pt-br/webgl1-to-webgl2.html +++ b/webgl/lessons/pt-br/webgl1-to-webgl2.html @@ -526,52 +526,53 @@

Fazendo as extensões WebGL1 parecer WebGL2

As funções que estavam em extensões no WebGL1 estão agora no contexto principal no WebGL2. Por exemplo, no WebGL

-var ext = gl.getExtension("OES_vertex_array_object");
+var ext = gl.getExtension("OES_vertex_array_object");
 if (!ext) {
   // Diga ao usuário que ele não têm a extensão necessária ou trabalhar em torno dela
 } else {
-  var someVAO = ext.createVertexArrayOES();
+  var someVAO = ext.createVertexArrayOES();
 }
 

vs em webgl2

-var someVAO = gl.createVertexArray();
+var someVAO = gl.createVertexArray();
 

Acomo você pode ver se você deseja que seu código seja executado tanto no WebGL1 quanto no WebGL2, que pode apresentar alguns desafios.

Uma solução seria copiar extensões WebGL1 ao contexto WebGL em tempo de inicialização. Dessa forma, o resto do seu código pode permanecer o mesmo. Exemplo:

-var gl = someCanvas.getContext("webgl");
-var haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object"));
-

function getAndApplyExtension(gl, name) { -var ext = gl.getExtension(name); -if (!ext) { -return false; -} -var suffix = name.split("")[0]; -var prefix = suffix = '‘; -var suffixRE = new RegExp(suffix + ‘$’); -var prefixRE = new RegExp(’^’ + prefix); -for (var key in ext) { -var val = ext[key]; -if (typeof(val) === ‘function’) { -// remover sufixo (ex: bindVertexArrayOES -> bindVertexArray) -var unsuffixedKey = key.replace(suffixRE, ‘’); -if (key.substing) -gl[unprefixedKey] = ext[key].bind(ext); -} else { -var unprefixedKey = key.replace(prefixRE, ‘’); -gl[unprefixedKey] = ext[key]; -} -} -

+var gl = someCanvas.getContext("webgl"); +var haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object")); + +function getAndApplyExtension(gl, name) { + var ext = gl.getExtension(name); + if (!ext) { + return false; + } + var suffix = name.split("_")[0]; + var prefix = suffix = '_'; + var suffixRE = new RegExp(suffix + '$'); + var prefixRE = new RegExp('^' + prefix); + for (var key in ext) { + var val = ext[key]; + if (typeof(val) === 'function') { + // remover sufixo (ex: bindVertexArrayOES -> bindVertexArray) + var unsuffixedKey = key.replace(suffixRE, ''); + if (key.substing) + gl[unprefixedKey] = ext[key].bind(ext); + } else { + var unprefixedKey = key.replace(prefixRE, ''); + gl[unprefixedKey] = ext[key]; + } + } +

Agora, seu código pode funcionar da mesma forma em ambos. Exemplo:

 if (haveVAOs) {
-  var someVAO = gl.createVertexArray();
+  var someVAO = gl.createVertexArray();
   ...
 } else {
   ... do whatever for no VAOs.
@@ -581,9 +582,9 @@ 

Fazendo as extensões WebGL1 parecer WebGL2

 if (haveVAOs) {
   if (isWebGL2)
-     someVAO = gl.createVertexArray();
+     someVAO = gl.createVertexArray();
   } else {
-     someVAO = vaoExt.createVertexArrayOES();
+     someVAO = vaoExt.createVertexArrayOES();
   }
   ...
 } else {
diff --git a/webgl/lessons/webgl-2d-drawimage.html b/webgl/lessons/webgl-2d-drawimage.html
index 86648c5e..1875ae87 100644
--- a/webgl/lessons/webgl-2d-drawimage.html
+++ b/webgl/lessons/webgl-2d-drawimage.html
@@ -697,16 +697,17 @@ 

A minor optimization

#version 300 es in vec4 a_position; -in vec2 a_texcoord; -

uniform mat4 u_matrix; -uniform mat4 u_textureMatrix;

-

out vec2 v_texcoord;

-

void main() { -gl_Position = u_matrix * a_position;

-
    -
  • v_texcoord = (u_textureMatrix * a_position).xy; + +uniform mat4 u_matrix; +uniform mat4 u_textureMatrix; + +out vec2 v_texcoord; + +void main() { + gl_Position = u_matrix * a_position; +* v_texcoord = (u_textureMatrix * a_position).xy; } -
- +

We can now remove the code that setup the texture coordinates and it will work just the same as before.

diff --git a/webgl/lessons/webgl-2d-vs-3d-library.html b/webgl/lessons/webgl-2d-vs-3d-library.html index c90f5d8a..4129b439 100644 --- a/webgl/lessons/webgl-2d-vs-3d-library.html +++ b/webgl/lessons/webgl-2d-vs-3d-library.html @@ -262,21 +262,21 @@

WebGL2 - Rasterization vs 3D libraries

Here’s the code in three.js to display this

   // Setup.
-  renderer = new THREE.WebGLRenderer({canvas: document.querySelector("#canvas")});
+  renderer = new THREE.WebGLRenderer({canvas: document.querySelector("#canvas")});
   c.appendChild(renderer.domElement);
 
   // Make and setup a camera.
-  camera = new THREE.PerspectiveCamera(70, 1, 1, 1000);
-  camera.position.z = 400;
+  camera = new THREE.PerspectiveCamera(70, 1, 1, 1000);
+  camera.position.z = 400;
 
   // Make a scene
-  scene = new THREE.Scene();
+  scene = new THREE.Scene();
 
   // Make a cube.
-  var geometry = new THREE.BoxGeometry(200, 200, 200);
+  var geometry = new THREE.BoxGeometry(200, 200, 200);
 
   // Make a material
-  var material = new THREE.MeshPhongMaterial({
+  var material = new THREE.MeshPhongMaterial({
     ambient: 0x555555,
     color: 0x555555,
     specular: 0xffffff,
@@ -285,15 +285,15 @@ 

WebGL2 - Rasterization vs 3D libraries

}); // Create a mesh based on the geometry and material - mesh = new THREE.Mesh(geometry, material); + mesh = new THREE.Mesh(geometry, material); scene.add(mesh); // Add 2 lights. - light1 = new THREE.PointLight(0xff0040, 2, 0); + light1 = new THREE.PointLight(0xff0040, 2, 0); light1.position.set(200, 100, 300); scene.add(light1); - light2 = new THREE.PointLight(0x0040ff, 2, 0); + light2 = new THREE.PointLight(0x0040ff, 2, 0); light2.position.set(-200, 100, 300); scene.add(light2);
@@ -322,10 +322,10 @@

WebGL2 - Rasterization vs 3D libraries

// Setup 2 lights glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); - float light0_position[] = { 200, 100, 300, }; - float light1_position[] = { -200, 100, 300, }; - float light0_color[] = { 1, 0, 0.25, 1, }; - float light1_color[] = { 0, 0.25, 1, 1, }; + float light0_position[] = { 200, 100, 300, }; + float light1_position[] = { -200, 100, 300, }; + float light0_color[] = { 1, 0, 0.25, 1, }; + float light1_color[] = { 0, 0.25, 1, 1, }; glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_color); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_color); glLightfv(GL_LIGHT0, GL_POSITION, light0_position); @@ -333,12 +333,12 @@

WebGL2 - Rasterization vs 3D libraries

... // Draw a cube. - static int count = 0; + static int count = 0; ++count; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); - double angle = count * 0.1; + double angle = count * 0.1; glTranslatef(0, 0, -400); glRotatef(angle, 0, 1, 0); diff --git a/webgl/lessons/webgl-less-code-more-fun.html b/webgl/lessons/webgl-less-code-more-fun.html index d66ad7d1..90fc24ab 100644 --- a/webgl/lessons/webgl-less-code-more-fun.html +++ b/webgl/lessons/webgl-less-code-more-fun.html @@ -657,10 +657,11 @@

Can we use the setters directly?

 // At initialization time
-var uniformSetters = twgl.createUniformSetters(program);
-

// At draw time +var uniformSetters = twgl.createUniformSetters(program); + +// At draw time uniformSetters.u_ambient([1, 0, 0, 1]); // set the ambient color to red. -

+

The reason this is not a good idea is because when you're working with GLSL you might modify the shaders from time to time, often to debug. Let's say we were not seeing anything on the screen in our program. One of the first things I do when nothing @@ -669,41 +670,44 @@

Can we use the setters directly?

 #version 300 es
 precision highp float;
-

in vec4 v_position; + +in vec4 v_position; in vec2 v_texCoord; in vec3 v_normal; in vec3 v_surfaceToLight; -in vec3 v_surfaceToView;

-

uniform vec4 u_lightColor; +in vec3 v_surfaceToView; + +uniform vec4 u_lightColor; uniform vec4 u_ambient; uniform sampler2D u_diffuse; uniform vec4 u_specular; uniform float u_shininess; -uniform float u_specularFactor;

-

out vec4 outColor;

-

vec4 lit(float l ,float h, float m) { -return vec4(1.0, -max(l, 0.0), -(l > 0.0) ? pow(max(0.0, h), m) : 0.0, -1.0); -}

-

void main() { -vec4 diffuseColor = texture2D(u_diffuse, v_texCoord); -vec3 a_normal = normalize(v_normal); -vec3 surfaceToLight = normalize(v_surfaceToLight); -vec3 surfaceToView = normalize(v_surfaceToView); -vec3 halfVector = normalize(surfaceToLight + surfaceToView); -vec4 litR = lit(dot(a_normal, surfaceToLight), -dot(a_normal, halfVector), u_shininess); -vec4 outColor = vec4(( -u_lightColor * (diffuseColor * litR.y + diffuseColor * u_ambient + -u_specular * litR.z * u_specularFactor)).rgb, -diffuseColor.a);

-
- + +void main() { + vec4 diffuseColor = texture2D(u_diffuse, v_texCoord); + vec3 a_normal = normalize(v_normal); + vec3 surfaceToLight = normalize(v_surfaceToLight); + vec3 surfaceToView = normalize(v_surfaceToView); + vec3 halfVector = normalize(surfaceToLight + surfaceToView); + vec4 litR = lit(dot(a_normal, surfaceToLight), + dot(a_normal, halfVector), u_shininess); + vec4 outColor = vec4(( + u_lightColor * (diffuseColor * litR.y + diffuseColor * u_ambient + + u_specular * litR.z * u_specularFactor)).rgb, + diffuseColor.a); +* outColor = vec4(0,1,0,1); // &lt;!--- just green +} +

Notice I just added a line that sets outColor to a constant color. Most drivers will see that none of the previous lines in the file actually contribute to the result. As such they'll optimize out all of our uniforms. The next time we run the program diff --git a/webgl/lessons/webgl-load-obj-w-mtl.html b/webgl/lessons/webgl-load-obj-w-mtl.html index 2b1a2c45..d6d7105c 100644 --- a/webgl/lessons/webgl-load-obj-w-mtl.html +++ b/webgl/lessons/webgl-load-obj-w-mtl.html @@ -1019,13 +1019,14 @@

Avoid conditionals in shaders where possible

uniform bool hasDiffuseMap; uniform vec4 diffuse; uniform sampler2D diffuseMap -

… -vec4 effectiveDiffuse = diffuse; -if (hasDiffuseMap) { -effectiveDiffuse *= texture2D(diffuseMap, texcoord); -} -… -

+ +... + vec4 effectiveDiffuse = diffuse; + if (hasDiffuseMap) { + effectiveDiffuse *= texture2D(diffuseMap, texcoord); + } +... +

Conditionals like that are generally discouraged because depending on the GPU/driver they are often not very performant.

Either do like we did above and try to make the code have no conditionals. We used diff --git a/webgl/lessons/webgl-planar-projection-mapping.html b/webgl/lessons/webgl-planar-projection-mapping.html index 17725ea0..8affe10c 100644 --- a/webgl/lessons/webgl-planar-projection-mapping.html +++ b/webgl/lessons/webgl-planar-projection-mapping.html @@ -958,17 +958,18 @@

Conditional Texture References

In the fragment shader above we get read both textures in all cases.


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

float projectedAmount = inRange ? 1.0 : 0.0; -gl_FragColor = mix(texColor, projectedTexColor, projectedAmount); -

+ vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + + float projectedAmount = inRange ? 1.0 : 0.0; + gl_FragColor = mix(texColor, projectedTexColor, projectedAmount); +

Why didn't we do something like this?


   if (inRange) {
-    gl_FragColor = texture(u_projectedTexture, projectedTexcoord.xy);
+    gl_FragColor = texture(u_projectedTexture, projectedTexcoord.xy);
   } else {
-    gl_FragColor = texture(u_texture, v_texcoord) * u_colorMult;
+    gl_FragColor = texture(u_texture, v_texcoord) * u_colorMult;
   }
 

From the GLSL ES 3.0 spec Section 8.8

@@ -982,20 +983,22 @@

Texture Lookup Functions

In other words, if we are going to use textures we must always access them. We can use the results conditionally. For example we could have written this:


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

if (inRange) { -gl_FragColor = projectedTexColor; -} else { -gl_FragColor = texColor; -} -

+ vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + + if (inRange) { + gl_FragColor = projectedTexColor; + } else { + gl_FragColor = texColor; + } +

or this


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

gl_FragColor = inRange ? projectedTexColor : texColor; -

+ vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + + gl_FragColor = inRange ? projectedTexColor : texColor; +

But we can't access the textures themselves conditionally. It might work on your GPU but it won't work on all GPUs.

In any case it's important to know.

diff --git a/webgl/lessons/webgl1-to-webgl2.html b/webgl/lessons/webgl1-to-webgl2.html index ee769b4c..8375d272 100644 --- a/webgl/lessons/webgl1-to-webgl2.html +++ b/webgl/lessons/webgl1-to-webgl2.html @@ -576,48 +576,49 @@

Making WebGL1 extensions look like WebGL2

One workaround would be to copy WebGL1 extensions to the WebGL context at init time. That way the rest of your code can stay the same. Example:

-const gl = someCanvas.getContext("webgl");
-const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object");
-

function getAndApplyExtension(gl, name) { -const ext = gl.getExtension(name); -if (!ext) { -return null; -} -const fnSuffix = name.split("")[0]; -const enumSuffix = '’ + fnSuffix; -for (const key in ext) { -const value = ext[key]; -const isFunc = typeof (value) === ‘function’; -const suffix = isFunc ? fnSuffix : enumSuffix; -let name = key; -// examples of where this is not true are WEBGL_compressed_texture_s3tc -// and WEBGL_compressed_texture_pvrtc -if (key.endsWith(suffix)) { -name = key.substring(0, key.length - suffix.length); -} -if (gl[name] !== undefined) { -if (!isFunc && gl[name] !== value) { -console.warn(“conflict:”, name, gl[name], value, key); -} -} else { -if (isFunc) { -gl[name] = function(origFn) { -return function() { -return origFn.apply(ext, arguments); -}; -}(value); -} else { -gl[name] = value; -} -} -} -return ext; +const gl = someCanvas.getContext("webgl"); +const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object"); + +function getAndApplyExtension(gl, name) { + const ext = gl.getExtension(name); + if (!ext) { + return null; + } + const fnSuffix = name.split("_")[0]; + const enumSuffix = '_' + fnSuffix; + for (const key in ext) { + const value = ext[key]; + const isFunc = typeof (value) === 'function'; + const suffix = isFunc ? fnSuffix : enumSuffix; + let name = key; + // examples of where this is not true are WEBGL_compressed_texture_s3tc + // and WEBGL_compressed_texture_pvrtc + if (key.endsWith(suffix)) { + name = key.substring(0, key.length - suffix.length); + } + if (gl[name] !== undefined) { + if (!isFunc && gl[name] !== value) { + console.warn("conflict:", name, gl[name], value, key); + } + } else { + if (isFunc) { + gl[name] = function(origFn) { + return function() { + return origFn.apply(ext, arguments); + }; + }(value); + } else { + gl[name] = value; + } + } + } + return ext; } -

+

Now your code can mostly just work the same on both. Example:

 if (haveVAOs) {
-  var someVAO = gl.createVertexArray();
+  var someVAO = gl.createVertexArray();
   ...
 } else {
   ... do whatever for no VAOs.
@@ -627,9 +628,9 @@ 

Making WebGL1 extensions look like WebGL2

 if (haveVAOs) {
   if (isWebGL2)
-     someVAO = gl.createVertexArray();
+     someVAO = gl.createVertexArray();
   } else {
-     someVAO = vaoExt.createVertexArrayOES();
+     someVAO = vaoExt.createVertexArrayOES();
   }
   ...
 } else {
diff --git a/webgl/lessons/zh_cn/atom.xml b/webgl/lessons/zh_cn/atom.xml
index 5316de47..dc21e840 100644
--- a/webgl/lessons/zh_cn/atom.xml
+++ b/webgl/lessons/zh_cn/atom.xml
@@ -2,7 +2,7 @@
 
     
     WebGL2 理论基础
-    2025-01-15T04:14:30.000Z
+    2025-01-15T04:49:01.000Z
     https://github.com/jpmonette/feed
     
         WebGL2Fundamentals Contributors
@@ -15,605 +15,605 @@
         <![CDATA[WebGL2 使用多个纹理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-2-textures.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 实现 DrawImage 接口]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-2d-drawimage.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 二维矩阵]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-2d-matrices.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 实现二维矩阵栈]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-2d-matrix-stack.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 二维旋转]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-2d-rotation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 二维缩放]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-2d-scale.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 二维平移]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-2d-translation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 三维相机]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-camera.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 三维几何加工]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-geometry-lathe.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 三维方向光源]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-lighting-directional.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 三维点光源]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-lighting-point.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 三维聚光灯]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-lighting-spot.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 三维正射投影]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-orthographic.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 3D 纹理映射的透视纠正]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-perspective-correct-texturemapping.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 三维透视投影]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-perspective.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 纹理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-3d-textures.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 样板]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-boilerplate.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 跨域图像]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-cors-permission.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 立方体贴图]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-cube-maps.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 三维数据纹理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-data-textures.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 绘制多个物体]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-drawing-multiple-things.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 环境贴图 (反射)]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-environment-maps.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 雾]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-fog.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2的基本原理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-fundamentals.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[怎样使用WebGL2]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-getting-webgl2.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 是如何工作的]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-how-it-works.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 进一步处理图像]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-image-processing-continued.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 图像处理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-image-processing.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 顶点索引]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-indexed-vertices.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 性能优化 - 实例化绘制]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-instanced-drawing.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 码少趣多]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-less-code-more-fun.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 加载带 Mtl 的 Obj]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-load-obj-w-mtl.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 加载 Obj 文件]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-load-obj.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 矩阵命名]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-matrix-naming.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 Picking]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-picking.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 平面的和透视的投影映射]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-planar-projection-mapping.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 渲染到纹理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-render-to-texture.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 重置画布尺寸]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-resizing-the-canvas.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 - 场景图]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-scene-graph.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 设置和安装]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-setup-and-installation.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 着色器和 GLSL 语言]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-shaders-and-glsl.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 阴影(续)]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-shadows-continued.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 阴影]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-shadows.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 蒙皮]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-skinning.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 天空盒]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-skybox.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 最小的程序]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-smallest-programs.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 精灵]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-sprites.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 State Diagram]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-state-diagram.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 文字 - 二维 Canvas]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-text-canvas2d.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 文字 - 使用字形纹理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-text-glyphs.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 文字 - HTML]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-text-html.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2 文字 - 使用纹理]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-text-texture.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[相较于WebGLFundamentals.org的不同之处]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl1-to-webgl2-fundamentals.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[迁移WebGL1到WebGL2]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl1-to-webgl2.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
     
         <![CDATA[WebGL2有什么新内容]]>
         https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl2-whats-new.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
         
             WebGL2Fundamentals Contributors
             https://webgl2fundamentals.org/contributors.html
         
-        2025-01-15T04:14:30.000Z
+        2025-01-15T04:49:01.000Z
     
 
\ No newline at end of file
diff --git a/webgl/lessons/zh_cn/webgl-2d-drawimage.html b/webgl/lessons/zh_cn/webgl-2d-drawimage.html
index 0d1350dc..79e0e477 100644
--- a/webgl/lessons/zh_cn/webgl-2d-drawimage.html
+++ b/webgl/lessons/zh_cn/webgl-2d-drawimage.html
@@ -678,16 +678,18 @@ 

一个小优化

#version 300 es in vec4 a_position; -in vec2 a_texcoord; -

uniform mat4 u_matrix; -uniform mat4 u_textureMatrix;

-

out vec2 v_texcoord;

-

void main() { -gl_Position = u_matrix * a_position;

-
    -
  • v_texcoord = (u_textureMatrix * a_position).xy; + +uniform mat4 u_matrix; +uniform mat4 u_textureMatrix; + +out vec2 v_texcoord; + +void main() { +gl_Position = u_matrix \* a_position; + +- v_texcoord = (u_textureMatrix \* a_position).xy; } -
- +

现在移除关于纹理坐标设置的代码,得到的结果和之前是相同的。

diff --git a/webgl/lessons/zh_cn/webgl-3d-geometry-lathe.html b/webgl/lessons/zh_cn/webgl-3d-geometry-lathe.html index 5c692e9c..0fc87cfb 100644 --- a/webgl/lessons/zh_cn/webgl-3d-geometry-lathe.html +++ b/webgl/lessons/zh_cn/webgl-3d-geometry-lathe.html @@ -922,22 +922,22 @@

这里的模运算符是做什么的?

起初我想通过提供一个误差范围,检查顶点的距离是否在范围内,如果小于误差范围就认为是同一点。 就像这样。

-const epsilon = 0.0001;
-const tempVerts = [];
+const epsilon = 0.0001;
+const tempVerts = [];
 function getVertIndex(position) {
   if (tempVerts.length) {
     // 找到最近的点
-    let closestNdx = 0;
-    let closestDistSq = v2.distanceSq(position, tempVerts[0]);
-    for (let i = 1; i < tempVerts.length; ++i) {
-      let distSq = v2.distanceSq(position, tempVerts[i]);
-      if (distSq < closestDistSq) {
-        closestDistSq = distSq;
-        closestNdx = i;
+    let closestNdx = 0;
+    let closestDistSq = v2.distanceSq(position, tempVerts[0]);
+    for (let i = 1; i < tempVerts.length; ++i) {
+      let distSq = v2.distanceSq(position, tempVerts[i]);
+      if (distSq < closestDistSq) {
+        closestDistSq = distSq;
+        closestNdx = i;
       }
     }
     // 是否在误差范围内
-    if (closestDistSq < epsilon) {
+    if (closestDistSq < epsilon) {
       // 是就返回那个点
       return closestNdx;
     }
@@ -973,24 +973,24 @@ 

这里的模运算符是做什么的?

使用矩阵运算是不是大材小用了?

当我们旋转点的时候使用这样的代码

-const mat = m4.yRotation(angle);
+const mat = m4.yRotation(angle);
 ...
-points.forEach((p, ndx) => {
-  const tp = m4.transformPoint(mat, [...p, 0]);
+points.forEach((p, ndx) => {
+  const tp = m4.transformPoint(mat, [...p, 0]);
   ...
 

使用 4x4 矩阵转换一个任意三维点需要 16 次乘法,12 次加法,和 3 次除法。 我们可以只使用 单位圆形式的旋转运算

-const s = Math.sin(angle);
-const c = Math.cos(angle);
+const s = Math.sin(angle);
+const c = Math.cos(angle);
 ...
-points.forEach((p, ndx) => {
-  const x = p[0];
-  const y = p[1];
-  const z = p[2];
-  const tp = [
+points.forEach((p, ndx) => {
+  const x = p[0];
+  const y = p[1];
+  const z = p[2];
+  const tp = [
     x * c - z * s,
     y,
     x * s + z * c,
diff --git a/webgl/lessons/zh_cn/webgl-3d-orthographic.html b/webgl/lessons/zh_cn/webgl-3d-orthographic.html
index becc5c59..94914917 100644
--- a/webgl/lessons/zh_cn/webgl-3d-orthographic.html
+++ b/webgl/lessons/zh_cn/webgl-3d-orthographic.html
@@ -748,24 +748,26 @@ 

为什么属性类型是 vec4 但是 gl.vertexAttribPointer 的大小是 3两个都是 'vec4' 类型,当我们告诉WebGL如何从缓冲中获取数据时使用

 // 告诉属性怎么从 positionBuffer (ARRAY_BUFFER) 中读取位置
-var size = 3;          // 每次迭代使用 3 个单位的数据
-var type = gl.FLOAT;   // 单位数据类型是32位的浮点型
-var normalize = false; // 不需要归一化数据
-var stride = 0;        // 0 = 移动距离 * 单位距离长度sizeof(type)
+var size = 3;          // 每次迭代使用 3 个单位的数据
+var type = gl.FLOAT;   // 单位数据类型是32位的浮点型
+var normalize = false; // 不需要归一化数据
+var stride = 0;        // 0 = 移动距离 * 单位距离长度sizeof(type)
                        // 每次迭代跳多少距离到下一个数据
-var offset = 0;        // 从绑定缓冲的起始处开始
+var offset = 0;        // 从绑定缓冲的起始处开始
 gl.vertexAttribPointer(
     positionAttributeLocation, size, type, normalize, stride, offset);
-

… + +... // 告诉颜色属性怎么从 colorBuffer (ARRAY_BUFFER) 中读取颜色值 -var size = 3; // 每次迭代使用 3 个单位的数据 -var type = gl.UNSIGNED_BYTE; // 单位数据类型是无符号 8 位整数 -var normalize = true; // 标准化数据 (从 0-255 转换到 0.0-1.0) -var stride = 0; // 0 = 移动距离 * 单位距离长度 sizeof(type) +var size = 3; // 每次迭代使用 3 个单位的数据 +var type = gl.UNSIGNED_BYTE; // 单位数据类型是无符号 8 位整数 +var normalize = true; // 标准化数据 (从 0-255 转换到 0.0-1.0) +var stride = 0; // 0 = 移动距离 \* 单位距离长度 sizeof(type) // 每次迭代跳多少距离到下一个数据 -var offset = 0; // 从绑定缓冲的起始处开始 +var offset = 0; // 从绑定缓冲的起始处开始 gl.vertexAttribPointer( -colorAttributeLocation, size, type, normalize, stride, offset);

+colorAttributeLocation, size, type, normalize, stride, offset); +

这里的 '3' 表示的时每次迭代从缓冲中提取三个值给顶点着色器中的属性。 diff --git a/webgl/lessons/zh_cn/webgl-how-it-works.html b/webgl/lessons/zh_cn/webgl-how-it-works.html index 10dd3c63..f7783e0a 100644 --- a/webgl/lessons/zh_cn/webgl-how-it-works.html +++ b/webgl/lessons/zh_cn/webgl-how-it-works.html @@ -517,11 +517,11 @@

WebGL2 是如何工作的

让我们更改代码以执行此操作。 当我们告诉WebGL如何提取颜色时,我们将使用如下代码:

-  var size = 4;
-*  var type = gl.UNSIGNED_BYTE;
-*  var normalize = true;
-  var stride = 0;
-  var offset = 0;
+  var size = 4;
+*  var type = gl.UNSIGNED_BYTE;
+*  var normalize = true;
+  var stride = 0;
+  var offset = 0;
   gl.vertexAttribPointer(colorLocation, size, type, normalize, stride, offset);
 

当我们用颜色填充缓冲区时,我们将使用如下代码:

@@ -530,13 +530,14 @@

WebGL2 是如何工作的

// that make the rectangle. function setColors(gl) { // Pick 2 random colors. - var r1 = Math.random() * 256; // 0 to 255.99999 - var b1 = Math.random() * 256; // these values - var g1 = Math.random() * 256; // will be truncated - var r2 = Math.random() * 256; // when stored in the - var b2 = Math.random() * 256; // Uint8Array - var g2 = Math.random() * 256; -

gl.bufferData( + var r1 = Math.random() * 256; // 0 to 255.99999 + var b1 = Math.random() * 256; // these values + var g1 = Math.random() * 256; // will be truncated + var r2 = Math.random() * 256; // when stored in the + var b2 = Math.random() * 256; // Uint8Array + var g2 = Math.random() * 256; + +gl.bufferData( gl.ARRAY_BUFFER, new Uint8Array( // Uint8Array [ r1, b1, g1, 255, @@ -546,7 +547,8 @@

WebGL2 是如何工作的

r2, b2, g2, 255, r2, b2, g2, 255]), gl.STATIC_DRAW); -}

+} +

下面是实例演示: diff --git a/webgl/lessons/zh_cn/webgl-less-code-more-fun.html b/webgl/lessons/zh_cn/webgl-less-code-more-fun.html index 0e36140f..382571b1 100644 --- a/webgl/lessons/zh_cn/webgl-less-code-more-fun.html +++ b/webgl/lessons/zh_cn/webgl-less-code-more-fun.html @@ -642,49 +642,55 @@

我们能直接使用 setter 么?

 // 初始化时
-var uniformSetters = twgl.createUniformSetters(program);
-

// 绘制时 -uniformSetters.u_ambient([1, 0, 0, 1]); // 设置环境光为红色

+var uniformSetters = twgl.createUniformSetters(program); + +// 绘制时 +uniformSetters.u_ambient([1, 0, 0, 1]); // 设置环境光为红色 +

这样做不好的原因就是,在使用GLSL的过程中经常会修改,调试。假设屏幕上什么都没有出现,首先我会简化着色器,例如我会尽可能简化片断着色器。

 #version 300 es
 precision highp float;
-

in vec4 v_position; + +in vec4 v_position; in vec2 v_texCoord; in vec3 v_normal; in vec3 v_surfaceToLight; -in vec3 v_surfaceToView;

-

uniform vec4 u_lightColor; +in vec3 v_surfaceToView; + +uniform vec4 u_lightColor; uniform vec4 u_ambient; uniform sampler2D u_diffuse; uniform vec4 u_specular; uniform float u_shininess; -uniform float u_specularFactor;

-

out vec4 outColor;

-

vec4 lit(float l ,float h, float m) { +uniform float u_specularFactor; + +out vec4 outColor; + +vec4 lit(float l ,float h, float m) { return vec4(1.0, max(l, 0.0), (l > 0.0) ? pow(max(0.0, h), m) : 0.0, 1.0); -}

-

void main() { -vec4 diffuseColor = texture2D(udiffuse, v_texCoord); -vec3 a_normal = normalize(v_normal); -vec3 surfaceToLight = normalize(v_surfaceToLight); -vec3 surfaceToView = normalize(v_surfaceToView); -vec3 halfVector = normalize(surfaceToLight + surfaceToView); -vec4 litR = lit(dot(a_normal, surfaceToLight), +} + +void main() { +vec4 diffuseColor = texture2D(u*diffuse, v_texCoord); +vec3 a_normal = normalize(v_normal); +vec3 surfaceToLight = normalize(v_surfaceToLight); +vec3 surfaceToView = normalize(v_surfaceToView); +vec3 halfVector = normalize(surfaceToLight + surfaceToView); +vec4 litR = lit(dot(a_normal, surfaceToLight), dot(a_normal, halfVector), u_shininess); -vec4 outColor = vec4(( -u_lightColor * (diffuseColor _ litR.y + diffuseColor _ uambient + -u_specular * litR.z * u_specularFactor)).rgb, -diffuseColor.a);

-
    -
  • outColor = vec4(0,1,0,1); // <!— just green +vec4 outColor = vec4(( +u_lightColor * (diffuseColor _ litR.y + diffuseColor _ u*ambient + +u_specular * litR.z \* u_specularFactor)).rgb, +diffuseColor.a); + +- outColor = vec4(0,1,0,1); // &lt;!--- just green } -
- +

注意到我添加了一行,直接将 outColor 设置为固定颜色。 大多数驱动会发现之前的行没有为结果做贡献,优化后就会把没用的变量移除, 下次我运行程序调用 twgl.createUniformSetters 就不会为u_ambient 创建 setter,所以 uniformSetters.u_ambient() 就会报错。

diff --git a/webgl/lessons/zh_cn/webgl-load-obj-w-mtl.html b/webgl/lessons/zh_cn/webgl-load-obj-w-mtl.html index c1b1c5c2..c03651f7 100644 --- a/webgl/lessons/zh_cn/webgl-load-obj-w-mtl.html +++ b/webgl/lessons/zh_cn/webgl-load-obj-w-mtl.html @@ -997,13 +997,14 @@

尽可能避免在着色器中使用条件语句

uniform bool hasDiffuseMap; uniform vec4 diffuse; uniform sampler2D diffuseMap -

… -vec4 effectiveDiffuse = diffuse; + +... +vec4 effectiveDiffuse = diffuse; if (hasDiffuseMap) { -effectiveDiffuse *= texture2D(diffuseMap, texcoord); +effectiveDiffuse \*= texture2D(diffuseMap, texcoord); } -… -

+... +

这样的条件语句一般是不鼓励的,因为依赖于 GPU 或者驱动,它们没有很好的性能。

当没有纹理时我们用一个 1x1 像素的白点纹理,这样就不用考虑条件语句了。

或者,使用不同的着色器。一个带有该特性,一个没有,根据情况选择使用正确的着色器。

diff --git a/webgl/lessons/zh_cn/webgl-planar-projection-mapping.html b/webgl/lessons/zh_cn/webgl-planar-projection-mapping.html index 184160a4..9fb31af1 100644 --- a/webgl/lessons/zh_cn/webgl-planar-projection-mapping.html +++ b/webgl/lessons/zh_cn/webgl-planar-projection-mapping.html @@ -945,20 +945,22 @@

Texture Lookup Functions

换句话说,如果我们要使用纹理,那我们就必须确保总是能够访问到它们。 我们可以在条件语句内使用访问纹理的结果。例如我们可以写成这样:


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

if (inRange) { -gl_FragColor = projectedTexColor; + vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + +if (inRange) { + gl_FragColor = projectedTexColor; } else { -gl_FragColor = texColor; + gl_FragColor = texColor; } -

+

或者这样


-  vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy);
-  vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult;
-

gl_FragColor = inRange ? projectedTexColor : texColor; -

+ vec4 projectedTexColor = texture(u_projectedTexture, projectedTexcoord.xy); + vec4 texColor = texture(u_texture, v_texcoord) * u_colorMult; + +gl_FragColor = inRange ? projectedTexColor : texColor; +

但是我们不能在条件语句内访问纹理本身。这样做在你的 GPU 上可能是可行的, 但并不是在所有的 GPUs 上都能行。

无论如何,重要的是你要知道有这么个东西

diff --git a/webgl/lessons/zh_cn/webgl1-to-webgl2.html b/webgl/lessons/zh_cn/webgl1-to-webgl2.html index 2ecc1655..6d1c3d8e 100644 --- a/webgl/lessons/zh_cn/webgl1-to-webgl2.html +++ b/webgl/lessons/zh_cn/webgl1-to-webgl2.html @@ -487,48 +487,49 @@

让WebGL1扩展看起来像WebGL2

如你所见,如果你希望代码在WebGL1和WebGL2中都能运行,这会带来一些挑战。

一种解决方法是在初始时将WebGL1扩展复制到WebGL上下文。这种方法余下的代码可以保持不变。示例:

-const gl = someCanvas.getContext("webgl");
-const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object");
-

function getAndApplyExtension(gl, name) { -const ext = gl.getExtension(name); -if (!ext) { -return null; -} -const fnSuffix = name.split("")[0]; -const enumSuffix = '’ + fnSuffix; -for (const key in ext) { -const value = ext[key]; -const isFunc = typeof (value) === ‘function’; -const suffix = isFunc ? fnSuffix : enumSuffix; -let name = key; -// WEBGL_compressed_texture_s3tc -// 和WEBGL_compressed_texture_pvrtc不是true -if (key.endsWith(suffix)) { -name = key.substring(0, key.length - suffix.length); -} -if (gl[name] !== undefined) { -if (!isFunc && gl[name] !== value) { -console.warn(“conflict:”, name, gl[name], value, key); -} -} else { -if (isFunc) { -gl[name] = function(origFn) { -return function() { -return origFn.apply(ext, arguments); -}; -}(value); -} else { -gl[name] = value; -} -} -} -return ext; +const gl = someCanvas.getContext("webgl"); +const haveVAOs = getAndApplyExtension(gl, "OES_vertex_array_object"); + +function getAndApplyExtension(gl, name) { + const ext = gl.getExtension(name); + if (!ext) { + return null; + } + const fnSuffix = name.split("_")[0]; + const enumSuffix = '_' + fnSuffix; + for (const key in ext) { + const value = ext[key]; + const isFunc = typeof (value) === 'function'; + const suffix = isFunc ? fnSuffix : enumSuffix; + let name = key; + // WEBGL_compressed_texture_s3tc + // 和WEBGL_compressed_texture_pvrtc不是true + if (key.endsWith(suffix)) { + name = key.substring(0, key.length - suffix.length); + } + if (gl[name] !== undefined) { + if (!isFunc && gl[name] !== value) { + console.warn("conflict:", name, gl[name], value, key); + } + } else { + if (isFunc) { + gl[name] = function(origFn) { + return function() { + return origFn.apply(ext, arguments); + }; + }(value); + } else { + gl[name] = value; + } + } + } + return ext; } -

+

现在你的代码大部分可以同样工作,像这样

 if (haveVAOs) {
-  var someVAO = gl.createVertexArray();
+  var someVAO = gl.createVertexArray();
   ...
 } else {
   ... do whatever for no VAOs.
@@ -538,9 +539,9 @@ 

让WebGL1扩展看起来像WebGL2

 if (haveVAOs) {
   if (isWebGL2)
-     someVAO = gl.createVertexArray();
+     someVAO = gl.createVertexArray();
   } else {
-     someVAO = vaoExt.createVertexArrayOES();
+     someVAO = vaoExt.createVertexArrayOES();
   }
   ...
 } else {