WebGL

Khronos

WebGL 仕様

編集者草案 Thu Feb 19 12:14:33 2026 -0800

このバージョン:
https://www.khronos.org/registry/webgl/specs/latest/1.0/
WebIDL: https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
最新バージョン:
https://www.khronos.org/registry/webgl/specs/latest/1.0/
WebIDL: https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
前のバージョン:
https://www.khronos.org/registry/webgl/specs/1.0.3/
WebIDL: https://www.khronos.org/registry/webgl/specs/1.0.3/webgl.idl
編集者:
Kelsey Gilbert (Mozilla Corp.)
Copyright © 2015 Khronos Group

概要

この仕様は、 HTML 5 canvas 要素 [CANVAS] のための追加のレンダリングコンテキストおよびサポートオブジェクトについて記述する。 このコンテキストは、OpenGL ES 2.0 API に非常に近く準拠する API を用いたレンダリングを可能にする。

この文書のステータス

この文書は編集者草案である。作業中のもの以外としてこの文書を引用してはならない。

フィードバック

この仕様に関する公開の議論は、 [email protected] メーリングリスト (手順アーカイブ)で歓迎される。

仕様またはその適合性テストに対するバグは、 課題トラッカーに登録されたい。 Github リポジトリへのプルリクエストも歓迎される。

目次

はじめに

WebGL™ は、ウェブ向けに設計された即時モードの 3D レンダリング API である。 これは OpenGL® ES 2.0 に由来し、同様のレンダリング機能を提供するが、 HTML の文脈で動作する。WebGL は HTML Canvas 要素のレンダリングコンテキストとして 設計されている。HTML Canvas は、ウェブページ内でのプログラムによる レンダリングの出力先を提供し、異なるレンダリング API を用いてそのレンダリングを 行うことを可能にする。Canvas 仕様の一部として記述されるそのような唯一の インターフェイスは、2D canvas レンダリングコンテキストである CanvasRenderingContext2D である。この文書は、WebGL API を提示する WebGLRenderingContext という、もう 1 つのそのようなインターフェイスを記述する。

この API の即時モードという性質は、ほとんどのウェブ API からの逸脱である。 3D グラフィックスの多くのユースケースを考慮し、WebGL は任意のユースケースに 適用できる柔軟なプリミティブを提供するという方針を選択している。 ライブラリは WebGL の上に、特定の領域により適合した API を提供でき、 それにより WebGL に利便性レイヤーを追加して、開発を高速化し簡略化できる。 しかし、OpenGL ES 2.0 を継承しているため、現代的なデスクトップ OpenGL または OpenGL ES 2.0 の開発に慣れた開発者が WebGL 開発へ移行するのは 直感的であるはずである。

規約

この文書で記述される多くの関数には、OpenGL ES の man ページへのリンクが含まれる。 これらのページを OpenGL ES 2.0 仕様 [GLES20] に 一致させるためにあらゆる努力が払われているが、誤りが含まれる可能性がある。 矛盾がある場合、OpenGL ES 2.0 仕様が最終的な権威となる。

この文書の残りの節は、OpenGL ES 2.0 仕様(執筆時点では 2.0.25、 Khronos OpenGL ES API Registry から入手可能)と併せて読まれることを意図している。 別途指定されない限り、各メソッドの振る舞いは OpenGL ES 2.0 仕様によって定義される。 この仕様は、相互運用性またはセキュリティを確保するために OpenGL ES 2.0 から 逸脱することがあり、多くの場合 OpenGL ES 2.0 が実装定義のままにしている領域を 定義する。これらの相違点は、 WebGL と OpenGL ES 2.0 の相違点の節にまとめられている。

コンテキストの作成と描画バッファの提示

WebGL API を使用する前に、著者は以下に記述されるように、 与えられた HTMLCanvasElement [CANVAS] または OffscreenCanvas [OFFSCREENCANVAS] に対して WebGLRenderingContext オブジェクトを取得しなければならない。 このオブジェクトは、OpenGL 状態を管理し、コンテキスト作成時に作成されなければならない 描画バッファへレンダリングするために使用される。

コンテキストの作成

WebGLRenderingContext は、作成時に設定される 関連付けられた canvas を持ち、 それは canvas [CANVAS] または offscreen canvas [OFFSCREENCANVAS] である。

WebGLRenderingContext は、作成時に WebGLContextAttributes オブジェクト内に 設定される コンテキスト作成パラメーター を持つ。

WebGLRenderingContext は、描画バッファが作成されるたびに WebGLContextAttributes オブジェクト内に 設定される 実際のコンテキストパラメーター を持つ。

WebGLRenderingContext は、初期状態では設定されていない webgl コンテキスト喪失フラグ を持つ。

canvas 要素または offscreen canvas オブジェクトの getContext() メソッドが、contextId webgl [CANVASCONTEXTS] に対して新しいオブジェクトを 返すことになっている場合、ユーザーエージェントは次の手順を実行しなければならない。

  1. 新しい WebGLRenderingContext オブジェクト context を作成する。
  2. contextcanvas を、 getContext() メソッドが関連付けられている canvas または offscreen canvas とする。
  3. 新しい WebGLContextAttributes オブジェクト contextAttributes を作成する。
  4. getContext() が第 2 引数 options 付きで呼び出された場合、 contextAttributes の属性を options で指定されたものから設定する。
  5. contextAttributes で指定された設定を用いて 描画バッファを作成し、 その 描画バッファcontext に関連付ける。
  6. 描画バッファの作成が失敗した場合、次の手順を実行する。
    1. canvas に対して WebGL コンテキスト作成エラーを発火する。
    2. null を返し、これらの手順を終了する。
  7. 新しい WebGLContextAttributes オブジェクト actualAttributes を作成する。
  8. 新しく作成された描画バッファのプロパティに基づいて、 actualAttributes の属性を設定する。
  9. contextコンテキスト作成 パラメーターcontextAttributes に設定する。
  10. context実際のコンテキスト パラメーターactualAttributes に設定する。
  11. context を返す。

canvas コンテキスト型 'experimental-webgl' は歴史的に、まだ完全ではない、または 適合していない WebGL 実装へのアクセスを提供するために使用されてきた。

ユーザーエージェントが webglexperimental-webgl の 両方の canvas コンテキスト型をサポートする場合、それらは別名として扱われなければならない。 たとえば、getContext('webgl') の呼び出しが WebGLRenderingContext を 正常に作成する場合、その後の getContext('experimental-webgl') の呼び出しは 同じコンテキストオブジェクトを返さなければならない。

描画バッファ

API 呼び出しがレンダリングされる描画バッファは、WebGLRenderingContext オブジェクトの 作成時に定義されなければならない。次の記述は、 描画バッファを作成する方法を定義する。

下の表は、描画バッファを構成するすべてのバッファと、それらの最小サイズ、および デフォルトで定義されるかどうかを示す。この描画バッファのサイズは、 HTMLCanvasElement または OffscreenCanvas の width および height 属性によって決定されなければならない。下の表は、これらのバッファが 最初に作成されたとき、サイズが変更されたとき、または preserveDrawingBuffer コンテキスト作成属性が false のときに 提示後にクリアされる値も示している。

バッファ クリア値 最小サイズ デフォルトで定義されるか?
(0, 0, 0, 0) コンポーネントあたり 8 ビット はい
深度 1.0 16 ビット整数 はい
ステンシル 0 8 ビット いいえ

HTMLCanvasElement.width および .height の値が 1 未満の場合、 1 として扱われる。0x0 の canvas は 1x1 の drawingBufferWidth/Height を生じる。

要求された width または height を満たせない場合、描画バッファが最初に作成されるとき、 または HTMLCanvasElement もしくは OffscreenCanvaswidth および height 属性が変更されるときに、 より小さい寸法の描画バッファが作成されなければならない。実際に使用される寸法は 実装依存であり、同じアスペクト比のバッファが作成される保証はない。 実際の描画バッファサイズは、drawingBufferWidth および drawingBufferHeight 属性から取得できる。

WebGL 実装は、高精細ディスプレイ上で描画バッファのサイズに対して自動的な拡大縮小を 行ってはならない。コンテキストの drawingBufferWidth および drawingBufferHeight は、実装依存の制約を考慮したうえで、canvas の width および height 属性に可能な限り一致しなければならない。

上記の制約は、高精細ディスプレイ上であっても、canvas 要素がウェブページ上で占める 空間の量を変更しない。canvas の 組み込みの 寸法 [CANVAS] はその座標空間のサイズと等しく、 数値は CSS ピクセルとして解釈され、CSS ピクセルは 解像度非依存 [CSS] である。

WebGL アプリケーションは、window.devicePixelRatio のようなプロパティを調べ、 canvas の width および height をその係数で拡大し、 その CSS width および height を元の width および height に設定することによって、 高精細ディスプレイ上で描画バッファのピクセルと画面上のピクセルとの 1:1 の比率を 実現できる。アプリケーションは、canvas の width および height プロパティを単に拡大することで、より高解像度のディスプレイ上で 実行している効果をシミュレートできる。

任意の WebGLContextAttributes オブジェクトは、 バッファが定義されるかどうかを変更するために使用できる。また、カラーバッファが アルファチャンネルを含むかどうかを定義するためにも使用できる。定義される場合、 アルファチャンネルは HTML コンポジターによって、カラーバッファをページの残りの部分と 合成するために使用される。WebGLContextAttributes オブジェクトは、 getContext の最初の呼び出し時にのみ使用される。描画バッファの作成後に その属性を変更する機能は提供されない。

depthstencil および antialias 属性が true に 設定されている場合、それらは要求であり、要件ではない。WebGL 実装はそれらを尊重するために 最善の努力を行うべきである。ただし、これらの属性のいずれかが false に設定されている場合、 WebGL 実装は関連する機能を提供してはならない。WebGL 実装またはグラフィックスハードウェアで サポートされていない属性の組み合わせは、WebGLRenderingContext の作成に失敗させてはならない。 実際のコンテキスト パラメーターは、作成された描画バッファの属性に設定される。 alphapremultipliedAlpha および preserveDrawingBuffer 属性は、WebGL 実装によって従われなければならない。

WebGL は、合成処理の直前に描画バッファを HTML ページコンポジターへ提示するが、 前回の合成処理以降に次のいずれかが呼び出された場合に限られる。

描画バッファが合成のために提示される前に、実装はすべてのレンダリング操作が描画バッファへ フラッシュされていることを保証しなければならない。デフォルトでは、合成後、描画バッファの 内容は上の表に示されるデフォルト値へクリアされなければならない。

このデフォルトの振る舞いは、 WebGLContextAttributes オブジェクトの preserveDrawingBuffer 属性を設定することで変更できる。このフラグが true の場合、 描画バッファの内容は、著者がそれらをクリアまたは上書きするまで保持されなければならない。 このフラグが false の場合、レンダリング関数が返った後にこのコンテキストをソース画像として 使用する操作を試みると、未定義の振る舞いにつながる可能性がある。これには、 readPixels または toDataURL 呼び出し、このコンテキストを 別のコンテキストの texImage2D または drawImage 呼び出しの ソース画像として使用すること、またはこのコンテキストの canvas から ImageBitmap [HTML] を作成することが含まれる。

描画バッファを保持することが望ましい場合もあるが、一部のプラットフォームでは大きな 性能低下を引き起こす可能性がある。可能な限り、このフラグは false のままにし、 他の手法を用いるべきである。同期的な描画バッファアクセス(たとえば描画バッファへ レンダリングする同じ関数内で readPixels または toDataURL を 呼び出す)などの手法を用いて、描画バッファの内容を取得できる。著者が一連の呼び出しに わたって同じ描画バッファへレンダリングする必要がある場合、 Framebuffer Object を使用できる。

実装は、著者が別のプロセスからバッファの内容へアクセスできないという保証ができる限り、 描画バッファの必要な暗黙のクリア操作を最適化によって省略してもよい。たとえば、著者が 明示的なクリアを実行する場合、暗黙のクリアは不要である。

undefined drawingBufferStorage(GLenum sizedFormat, unsigned long width, unsigned long height);
Renderbuffers で使用される renderbufferStorage と同様に、 描画バッファの形式およびサイズを再指定する。 クリアの振る舞いは、HTMLCanvasElement.width および HTMLCanvasElement.height を設定し、その後描画バッファ形式を変更することと 同等である。このメソッドは WebGLContextAttributes.antialias を尊重する。
drawingBufferStorage は、width と height を同時にまとめて効率的に 再指定できるようにする。 HTMLCanvasElement.width および HTMLCanvasElement.height では、 片方を設定してからもう片方を設定すると、中間的な再割り当てが発生する可能性があるが、 ユーザーエージェントはそれらを最適化して取り除こうとする。
drawingBufferStorage が成功した場合、drawingBufferFormatsizedFormat になる。 drawingBufferWidth および drawingBufferHeight は、それぞれ width および height になる。 したがって、デフォルト framebuffer 上の操作は、sizedFormat の添付を持つ 非デフォルト framebuffer 上で操作しているかのように振る舞う。 たとえば drawingBufferStorage(gl.RGBA16F, 1, 1) の後では、 framebuffer は "floatish" であるため、readPixels の主な format/type ペアは RGBA/UNSIGNED_BYTE ではなく RGBA/FLOAT になる。 WebGLContextAttributes.alphafalse の場合、 INVALID_OPERATION を生成する。 RGBA8sizedFormat に対して常にサポートされる。 さらに、次の列挙値は、現在 renderbufferStorage に対して有効な場合に サポートされる。 sizedFormat が現在サポートされていない場合、 INVALID_ENUM を生成する。

WebGL 1.0 では、SRGB8_ALPHA8 は拡張 EXT_sRGB を必要とする。 WebGL 2.0 では、SRGB8_ALPHA8 は拡張を必要としない。

WebGL 1.0 では、RGBA16F は拡張 EXT_color_buffer_half_float を必要とする。 WebGL 2.0 では、RGBA16F は拡張 EXT_color_buffer_float を必要とする。

width または height が制限 MAX_RENDERBUFFER_SIZE より 大きい場合、INVALID_VALUE を生成する。 割り当てが失敗した場合、OUT_OF_MEMORY を生成する。

WebGL ビューポート

OpenGL は、その状態の一部として矩形のビューポートを管理し、これは描画バッファ内での レンダリング結果の配置を定義する。WebGL コンテキスト context の作成時に、 ビューポートは、原点が (0, 0) で、幅と高さが (context.drawingBufferWidth, context.drawingBufferHeight) に等しい矩形として初期化される。

WebGL 実装は、canvas 要素のリサイズに応じて OpenGL ビューポートの状態に影響を 与えてはならない

WebGL プログラムがビューポートを設定するロジックを含まない場合、canvas がリサイズされる 事例を適切に処理できないことに注意。次の ECMAScript 例は、WebGL プログラムが プログラム的に canvas をリサイズする方法を示す。
var canvas = document.getElementById('canvas1');
var gl = canvas.getContext('webgl');
canvas.width = newWidth;
canvas.height = newHeight;
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
        

根拠: ビューポートを自動的に設定すると、それを手動で設定するアプリケーションと 干渉する。アプリケーションは、canvas のサイズ変更に応答して OpenGL ビューポートを順に 設定するために、onresize ハンドラーを使用することが期待される。

プリマルチプライドアルファ、Canvas API および texImage2D

OpenGL API は、アプリケーションがレンダリング中に使用されるブレンディングモードを 変更することを可能にし、そのため描画バッファ内のアルファ値がどのように解釈されるかを 制御できる。WebGLContextAttributes の節の premultipliedAlpha パラメーターを参照。

HTML Canvas API の toDataURL および drawImage は、 premultipliedAlpha コンテキスト作成パラメーターを尊重しなければならない。 WebGL コンテンツがレンダリングされている Canvas に対して toDataURL が 呼び出された場合、要求された画像形式がプリマルチプライドアルファを指定しておらず、 WebGL コンテキストの premultipliedAlpha パラメーターが true に設定されているなら、 ピクセル値は非乗算化されなければならない。すなわち、色チャンネルはアルファチャンネルで 除算される。この操作は損失を伴うことに注意

WebGL でレンダリングされた Canvas を CanvasRenderingContext2DdrawImage メソッドに渡す場合、CanvasRenderingContext2D 実装の プリマルチプライの必要性に応じて、描画操作中にレンダリング済みの WebGL コンテンツを 変更する必要がある場合もあれば、ない場合もある。

WebGL でレンダリングされた Canvas を texImage2D API に渡す場合、 渡された canvas の premultipliedAlpha コンテキスト作成パラメーターの設定と、 宛先 WebGL コンテキストの UNPACK_PREMULTIPLY_ALPHA_WEBGL ピクセルストア パラメーターに応じて、ピクセルデータをプリマルチプライド形式へ、またはそこから変更する 必要がある場合がある。

WebGL リソース

OpenGL は、その状態の一部として複数の種類のリソースを管理する。これらは整数の オブジェクト名によって識別され、さまざまな作成呼び出しによって OpenGL から取得される。 これに対して、WebGL はこれらのリソースを DOM オブジェクトとして表現する。各オブジェクトは WebGLObject インターフェイスから派生する。現在サポートされるリソースは、 テクスチャ、バッファ(すなわち VBO)、framebuffer、renderbuffer、shader および program である。WebGLRenderingContext インターフェイスには、各種類について WebGLObject サブクラスを作成するメソッドがある。基盤となるグラフィックスライブラリの データはこれらのオブジェクト内に格納され、それらによって完全に管理される。 DOM オブジェクトは、著者が明示的な参照を保持している間だけでなく、基盤となる グラフィックスライブラリによって使用中である間も生存し続ける。 DOM オブジェクトが破棄されると、それは自身のリソースを削除対象としてマークする。 著者が DOM オブジェクトの破棄前にオブジェクトを削除対象としてマークしたい場合、 対応する delete 関数(例: deleteTexture)を明示的に呼び出してもよい。

セキュリティ

リソース制限

テクスチャや頂点バッファオブジェクト(VBO)などの WebGL リソースは、 初期ユーザーデータ値なしで作成された場合であっても、常に初期化済みデータを 含まなければならない。初期値なしでリソースを作成することは、テクスチャまたは VBO の 領域を確保し、その後 texSubImage または bufferSubData 呼び出しを 用いて変更するために一般的に使用される。これらの呼び出しに初期データが提供されない場合、 WebGL 実装はそれらの内容を 0 に初期化しなければならない。深度リソースはデフォルトの 1.0 クリア深度へクリアされなければならない。これは、要求された VBO のサイズの ゼロ化された一時バッファを作成し、それを正しく初期化できるようにすることを 必要とする場合がある。テクスチャまたは VBO へデータを読み込む他のすべての形式は、 ArrayBuffers または画像などの DOM オブジェクトのいずれかを伴うため、すでに 初期化されていることが要求されている。

drawElements または drawArrays のような呼び出しを通じて WebGL リソースが shader によってアクセスされる場合、WebGL 実装は shader が範囲外または 未初期化データのいずれにもアクセスできないことを保証しなければならない。 WebGL 実装によって強制されなければならない制限については、 有効化された頂点属性と範囲チェックを参照。

オリジン制限

情報漏えいを防ぐため、WebGL は次のものをテクスチャとしてアップロードすることを禁止する。

texImage2D または texSubImage2D メソッドが、他の点では正しい 引数とともに、これらの制限に違反する HTMLImageElementHTMLVideoElementHTMLCanvasElement、または ImageBitmap を用いて呼び出された場合、SECURITY_ERR 例外が 投げられなければならない。

WebGL は、2D canvas レンダリングコンテキストなどの他の API よりも、クロスドメインの メディアの使用に対してより強い制限を必然的に課す。なぜなら、GPU へアップロードされた テクスチャの内容を shader を用いて間接的に推測できるためである。

WebGL アプリケーションは、メディアをホストするサーバーの協力のもとで、 Cross-Origin Resource Sharing [CORS] を使用して、他のドメインから来る画像や 動画を利用できる。そのようなメディアを使用するには、アプリケーションはそうする 権限を明示的に要求する必要があり、サーバーは明示的に権限を付与する必要がある。 他のドメインからの画像および動画要素の CORS 対応フェッチが成功すると、 これらの要素の オリジンは、それを含む Document [HTML] のオリジンに 設定される。

次の ECMAScript 例は、別のドメインから来る画像に対して CORS リクエストを 発行する方法を示す。画像は、資格情報、すなわち cookie なしでサーバーから取得される。

var gl = ...;
var image = new Image();

// The onload handler should be set to a function which uploads the HTMLImageElement
// using texImage2D or texSubImage2D.
image.onload = ...;

image.crossOrigin = "anonymous";

image.src = "http://other-domain.com/image.jpg";

これらの規則は、WebGL を用いてレンダリングされた canvas の origin-clean フラグが 決して false に設定されないことを意味することに注意。

画像および動画要素に対して CORS リクエストを発行することに関する詳細については、 次を参照。

サポートされる GLSL 構文

WebGL 実装は、The OpenGL ES Shading Language, Version 1.00 [GLES20GLSL] に準拠し、かつ Appendix A の Sections 4 および 5 で 義務付けられている最小機能を超えない shader のみを受け入れなければならない。 特に次のとおりである。

前述の仕様における予約識別子に加えて、"webgl_" および "_webgl_" で始まる識別子は WebGL による使用のために予約される。これらの接頭辞で始まる関数、変数、構造体名、 または構造体フィールドを宣言する shader は、読み込みを許可されてはならない。

WebGL 1.0 実装は、shader 内で行継続文字 '\' も追加でサポートしなければならない。

サービス拒否への防御

意図的または非意図的に、レンダリングに望ましくないほど長い時間を要する shader と ジオメトリの組み合わせを作成することが可能である。この問題は、ユーザーエージェントが すでに保護策を持つ長時間実行スクリプトの問題に類似している。しかし、長時間実行される draw 呼び出しは、ユーザーエージェントだけでなく、ウィンドウシステム全体の 対話性を失わせる可能性がある。

一般的な場合、この問題を防ぐために入力される shader の構造に制限を課すことはできない。 実験により、非常に厳格な構造的制限であっても長いレンダリング時間を防ぐには不十分であり、 そのような制限は shader の著者が一般的なアルゴリズムを実装することを妨げることが 示されている。

ユーザーエージェントは、過度に長いレンダリング時間およびそれに伴う対話性の喪失を 防ぐための保護策を実装すべきである。提案される保護策には次が含まれる。

OS およびグラフィックス API 層の支援インフラストラクチャは、時間とともに改善されることが 期待されるため、これらの保護策の正確な性質は指定されない。

範囲外の配列アクセス

Shaders は、アプリケーション自身のデータの外にある配列要素を読み書きすることを 許可されてはならない。これには、配列型の任意の変数に加えて、配列添字構文を用いて アクセスされる場合の vec3 または mat4 などのベクトル型または 行列型も含まれる。コンパイル時に検出された場合、そのようなアクセスはエラーを生成し、 shader のコンパイルを防がなければならない。そうでなければ、実行時に範囲外読み取りは、 次のいずれかの値を返さなければならない。

範囲外書き込みは破棄されるか、またはプログラムがアクセス可能なストレージ内の 未指定の値を変更する。

この振る舞いは、[KHRROBUSTACCESS] で定義されるものを再現する。

shader における配列添字操作の静的解析を簡略化する制限についての詳細は、 サポートされる GLSL 構文を参照。

DOM インターフェイス

この節は、上で記述された機能への実行時アクセスをサポートするために DOM に追加されるインターフェイスおよび機能について記述する。

次の型は、以下の節のすべてのインターフェイスで使用される。

typedef unsigned long  GLenum;
typedef boolean        GLboolean;
typedef unsigned long  GLbitfield;
typedef byte           GLbyte;         /* 'byte' should be a signed 8 bit type. */
typedef short          GLshort;
typedef long           GLint;
typedef long           GLsizei;
typedef long long      GLintptr;
typedef long long      GLsizeiptr;
// Ideally the typedef below would use 'unsigned byte', but that doesn't currently exist in Web IDL.
typedef octet          GLubyte;        /* 'octet' should be an unsigned 8 bit type. */
typedef unsigned short GLushort;
typedef unsigned long  GLuint;
typedef unrestricted float GLfloat;
typedef unrestricted float GLclampf;

// The power preference settings are documented in the WebGLContextAttributes
// section of the specification.
enum WebGLPowerPreference { "default", "low-power", "high-performance" };

WebGLContextAttributes

WebGLContextAttributes 辞書は描画サーフェス属性を含み、 getContext の第 2 パラメーターとして渡される。

dictionary WebGLContextAttributes {
    boolean alpha = true;
    boolean depth = true;
    boolean stencil = false;
    boolean antialias = true;
    boolean premultipliedAlpha = true;
    boolean preserveDrawingBuffer = false;
    WebGLPowerPreference powerPreference = "default";
    boolean failIfMajorPerformanceCaveat = false;
    boolean desynchronized = false;
};

コンテキスト作成パラメーター

次のリストは、WebGLContextAttributes オブジェクト内の各属性とその使用を記述する。 各属性のデフォルト値は上に示されている。デフォルト値は、 getContext に第 2 パラメーターが渡されない場合、または渡されたユーザーオブジェクトに 指定された名前の属性がない場合のいずれかで使用される。

alpha
値が true の場合、描画バッファは OpenGL の宛先アルファ操作およびページとの合成を 行う目的でアルファチャンネルを持つ。値が false の場合、アルファバッファは利用できない。
depth
値が true の場合、描画バッファは少なくとも 16 ビットの深度バッファを持つ。値が false の場合、深度バッファは利用できない。
stencil
値が true の場合、描画バッファは少なくとも 8 ビットのステンシルバッファを持つ。 値が false の場合、ステンシルバッファは利用できない。
antialias
値が true で、実装がアンチエイリアシングをサポートする場合、描画バッファは 実装が選択する手法(マルチサンプル/スーパーサンプル)および品質で アンチエイリアシングを実行する。値が false の場合、または実装がアンチエイリアシングを サポートしない場合、アンチエイリアシングは実行されない。
premultipliedAlpha

値が true の場合、ページコンポジターは描画バッファがプリマルチプライドアルファの 色を含むと仮定する。値が false の場合、ページコンポジターは描画バッファ内の色が プリマルチプライされていないと仮定する。このフラグは alpha フラグが false の場合は無視される。

premultipliedAlpha:true では、ページコンポジターへ送られるすべての ピクセルは、色の値がそのアルファ値以下でなければならない。 そうでなければ、そのような範囲外のピクセル値を合成した結果の色は未定義である。

たとえば、premultipliedAlpha:truevec4(1.0, 0.0, 0.0, 0.5) は、最適化されたパック合成演算の オーバーフローにより、赤ではなく緑として表示される可能性がある。 一貫した振る舞いを要求することによる解決困難な性能への影響のため、 これは未定義のままとされる。

premultipliedAlpha フラグの効果に関する詳細は、 プリマルチプライドアルファを参照。

preserveDrawingBuffer
false の場合、描画バッファの節で記述されるように 描画バッファが提示されると、描画バッファの内容はデフォルト値へクリアされる。 描画バッファのすべての要素(色、深度、ステンシル)がクリアされる。値が true の場合、 バッファはクリアされず、著者によってクリアまたは上書きされるまでその値を保持する。
一部のハードウェアでは、preserveDrawingBuffer フラグを true に設定すると重大な性能上の影響が生じる可能性がある。
powerPreference

この WebGL コンテキストに適した GPU 構成を示すヒントをユーザーエージェントへ 提供する。これは、複数の GPU を持つシステムでどの GPU が使用されるかに 影響する可能性がある。たとえば、デュアル GPU システムでは、レンダリング性能を犠牲にして 消費電力が少ない GPU が 1 つ存在することがある。このプロパティは単なるヒントであり、 WebGL 実装はこれを無視することを選択してもよいことに注意。

WebGL 実装は、この属性の値に関係なく、コンテキスト喪失および復元イベントを 使用して電力およびメモリ消費を制御する。

許可される値は次のとおりである。

default

どの GPU 構成が最も適しているかをユーザーエージェントに決定させる。 これがデフォルト値である。

high-performance

消費電力よりもレンダリング性能を優先する GPU 構成の要求を示す。 モバイルデバイスではバッテリー寿命を大幅に低下させる可能性があるため、 開発者は絶対に必要だと考える場合にのみこの値を指定することが推奨される。 実装は当初この要求を尊重し、一定時間後にコンテキストを喪失させ、 その要求を無視した新しいコンテキストを復元することを決定してもよい。

high-performance を要求するアプリケーションは、 ユーザーエージェントがバックグラウンドの high-performance コンテキストを喪失させることを決定する可能性が非常に高いため、 堅牢なコンテキスト喪失処理をテストし維持すべきである。

low-power

レンダリング性能よりも省電力を優先する GPU 構成の要求を示す。 一般に、コンテンツが描画性能によって制約されにくい場合にはこれを使用すべきである。 たとえば、毎秒 1 フレームのみをレンダリングする場合、単純な shader を用いた 比較的単純なジオメトリのみを描画する場合、または小さな HTML canvas 要素を 使用する場合である。モバイルデバイスではバッテリー寿命を大幅に改善する可能性が あるため、コンテンツが許すなら、開発者はこの値を使用することが推奨される。

failIfMajorPerformanceCaveat
値が true の場合、作成される WebGL コンテキストの性能が、同等の OpenGL 呼び出しを行う ネイティブアプリケーションの性能よりも著しく低いと実装が判断した場合、 コンテキストの作成は失敗する。これは、次を含むいくつかの理由で発生し得る。 高い性能を必要としないアプリケーションは、このパラメーターをデフォルト値の false のままにすべきである。高い性能を必要とするアプリケーションは このパラメーターを true に設定してもよく、コンテキスト作成が失敗した場合、 アプリケーションは 2D canvas コンテキストなどのフォールバックレンダリング経路を 使用することを選択してもよい。あるいは、性能を改善するために低忠実度のレンダリングモードを 使用すべきであることを理解したうえで、このパラメーターを false に設定して WebGL コンテキスト作成を再試行できる。
desynchronized

値が true の場合、ユーザーエージェントは、入力イベントからラスタライズまでで測定される レイテンシーを低減するために、canvas のペイントサイクルをイベントループから 非同期化する、通常のユーザーエージェントレンダリングアルゴリズムを迂回する、 またはその両方によって、canvas のレンダリングを最適化してもよい。このモードが 通常のペイント機構、ラスタライズ、またはその両方を迂回する限り、目に見える ティアリングアーティファクトを導入する可能性がある。

ユーザーエージェントは通常、表示されていないバッファ上にレンダリングし、 それを提示のために走査出力中のバッファと素早く入れ替える。前者のバッファは バックバッファと呼ばれ、後者はフロントバッファと呼ばれる。 レイテンシーを低減するための一般的な手法はフロントバッファレンダリングと呼ばれ、 シングルバッファレンダリングとしても知られ、レンダリングが走査出力処理と 並行して競合的に発生する。この手法は、ティアリングアーティファクトを導入する 可能性という代償でレイテンシーを低減し、desynchronized boolean の全部または一部を実装するために使用できる。 [MULTIPLEBUFFERING]

desynchronized boolean は、描画アプリケーションなど、 入力とラスタライズの間のレイテンシーが重要な特定の種類のアプリケーションを 実装する場合に有用であり得る。

これは、WebGLContextAttributes 引数を getContext に渡す ECMAScript 例である。 ページ上に "canvas1" という名前の canvas 要素が存在することを仮定している。
var canvas = document.getElementById('canvas1');
var context = canvas.getContext('webgl',
                                { antialias: false,
                                  stencil: true });
    

WebGLObject

WebGLObject インターフェイスは、すべての GL オブジェクトの親インターフェイスである。

WebGLObject は、初期状態では設定されていない 内部の invalidated フラグを持つ。

WebGLObject.label 属性を持ち、そのデフォルトは "" である。実装は、デバッグを改善するために、たとえばエラーメッセージで、 および/またはネイティブレベルのデバッグツールを支援するために可能であれば基盤となる ドライバーへラベルを提供するために、このアプリケーション提供のラベル文字列を使用すべきである。 実装はラベルによって振る舞いを変更してはならない。

[Exposed=(Window,Worker)]
interface WebGLObject {
    attribute USVString label;
};

WebGLBuffer

WebGLBuffer インターフェイスは OpenGL Buffer Object を表す。 基盤となるオブジェクトは、glGenBuffers を呼び出したかのように作成され OpenGL ES 2.0 §2.9man ページ 、glBindBuffer を呼び出したかのようにバインドされ OpenGL ES 2.0 §2.9man ページ 、glDeleteBuffers を呼び出したかのように削除対象としてマークされる OpenGL ES 2.0 §2.9man ページ

[Exposed=(Window,Worker)]
interface WebGLBuffer : WebGLObject {
};

WebGLFramebuffer

WebGLFramebuffer インターフェイスは OpenGL Framebuffer Object を表す。 基盤となるオブジェクトは、glGenFramebuffers を呼び出したかのように作成され OpenGL ES 2.0 §4.4.1man ページ 、glBindFramebuffer を呼び出したかのようにバインドされ OpenGL ES 2.0 §4.4.1man ページ 、glDeleteFramebuffers を呼び出したかのように削除対象としてマークされる OpenGL ES 2.0 §4.4.1man ページ

[Exposed=(Window,Worker)]
interface WebGLFramebuffer : WebGLObject {
};

WebGLProgram

WebGLProgram インターフェイスは OpenGL Program Object を表す。 基盤となるオブジェクトは、glCreateProgram を呼び出したかのように作成され OpenGL ES 2.0 §2.10.3man ページ 、glUseProgram を呼び出したかのように使用され OpenGL ES 2.0 §2.10.3man ページ 、glDeleteProgram を呼び出したかのように削除対象としてマークされる OpenGL ES 2.0 §2.10.3man ページ

[Exposed=(Window,Worker)]
interface WebGLProgram : WebGLObject {
};

WebGLRenderbuffer

WebGLRenderbuffer インターフェイスは OpenGL Renderbuffer Object を表す。 基盤となるオブジェクトは、glGenRenderbuffers を呼び出したかのように作成され OpenGL ES 2.0 §4.4.3man ページ 、glBindRenderbuffer を呼び出したかのようにバインドされ OpenGL ES 2.0 §4.4.3man ページ 、glDeleteRenderbuffers を呼び出したかのように削除対象としてマークされる OpenGL ES 2.0 §4.4.3man ページ

[Exposed=(Window,Worker)]
interface WebGLRenderbuffer : WebGLObject {
};

WebGLShader

WebGLShader インターフェイスは OpenGL Shader Object を表す。 基盤となるオブジェクトは、glCreateShader を呼び出したかのように作成され OpenGL ES 2.0 §2.10.1man ページ 、glAttachShader を呼び出したかのように Program へアタッチされ OpenGL ES 2.0 §2.10.3man ページ 、glDeleteShader を呼び出したかのように削除対象としてマークされる OpenGL ES 2.0 §2.10.1man ページ

[Exposed=(Window,Worker)]
interface WebGLShader : WebGLObject {
};

WebGLTexture

WebGLTexture インターフェイスは OpenGL Texture Object を表す。 基盤となるオブジェクトは、glGenTextures を呼び出したかのように作成され OpenGL ES 2.0 §3.7.13man ページ 、glBindTexture を呼び出したかのようにバインドされ OpenGL ES 2.0 §3.7.13man ページ 、glDeleteTextures を呼び出したかのように削除対象としてマークされる OpenGL ES 2.0 §3.7.13man ページ

[Exposed=(Window,Worker)]
interface WebGLTexture : WebGLObject {
};

WebGLUniformLocation

WebGLUniformLocation インターフェイスは、shader program 内の uniform 変数の 位置を表す。

[Exposed=(Window,Worker)]
interface WebGLUniformLocation {
};

WebGLActiveInfo

WebGLActiveInfo インターフェイスは、 getActiveAttrib および getActiveUniform 呼び出しから返される情報を表す。

[Exposed=(Window,Worker)]
interface WebGLActiveInfo {
    readonly attribute GLint size;
    readonly attribute GLenum type;
    readonly attribute DOMString name;
};

属性

次の属性が利用できる。

size 型は GLint
要求された変数のサイズ。
type 型は GLenum
要求された変数のデータ型。
name 型は DOMString
要求された変数の名前。

WebGLShaderPrecisionFormat

WebGLShaderPrecisionFormat インターフェイスは、 getShaderPrecisionFormat 呼び出しから返される情報を表す。

[Exposed=(Window,Worker)]
interface WebGLShaderPrecisionFormat {
    readonly attribute GLint rangeMin;
    readonly attribute GLint rangeMax;
    readonly attribute GLint precision;
};

属性

次の属性が利用できる。

rangeMin 型は GLint
表現できる最小値の絶対値の 2 を底とする対数。
rangeMax 型は GLint
表現できる最大値の絶対値の 2 を底とする対数。
precision 型は GLint
表現できる精度のビット数。整数形式では、この値は常に 0 である。

ArrayBuffer および Typed Arrays

頂点、インデックス、テクスチャ、およびその他のデータは、 ArrayBufferTyped Arrays および DataView を用いて WebGL 実装へ転送される。これらは ECMAScript 仕様 [ECMASCRIPT] で定義されている。

Typed Arrays は、インターリーブされた異種の頂点データの作成、大きな頂点バッファオブジェクトへの 個別のデータブロックのアップロード、および OpenGL プログラムで必要とされる ほとんどのその他のユースケースをサポートする。

これは、異なる型の typed arrays を用いて同じ ArrayBuffer へアクセスする ECMAScript 例である。 この場合、バッファには浮動小数点の頂点位置(x, y, z)に続いて、 4 個の符号なしバイト(r, g, b, a)として色が含まれている。
var numVertices = 100; // for example

// Compute the size needed for the buffer, in bytes and floats
var vertexSize = 3 * Float32Array.BYTES_PER_ELEMENT +
     4 * Uint8Array.BYTES_PER_ELEMENT;
var vertexSizeInFloats = vertexSize / Float32Array.BYTES_PER_ELEMENT;

// Allocate the buffer
var buf = new ArrayBuffer(numVertices * vertexSize);

// Map this buffer to a Float32Array to access the positions
var positionArray = new Float32Array(buf);

// Map the same buffer to a Uint8Array to access the color
var colorArray = new Uint8Array(buf);

// Set up the initial offset of the vertices and colors within the buffer
var positionIdx = 0;
var colorIdx = 3 * Float32Array.BYTES_PER_ELEMENT;

// Initialize the buffer
for (var i = 0; i < numVertices; i++) {
    positionArray[positionIdx] = ...;
    positionArray[positionIdx + 1] = ...;
    positionArray[positionIdx + 2] = ...;
    colorArray[colorIdx] = ...;
    colorArray[colorIdx + 1] = ...;
    colorArray[colorIdx + 2] = ...;
    colorArray[colorIdx + 3] = ...;
    positionIdx += vertexSizeInFloats;
    colorIdx += vertexSize;
}
    

WebGL コンテキスト

WebGLRenderingContext は、 canvas 要素内で OpenGL ES 2.0 スタイルのレンダリングを可能にする API を表す。

WebGLRenderingContext インターフェイスの任意のメソッド、 または getExtension メソッドによって返されるインターフェイスの任意のメソッドの 実装を実行する前に、次の手順が実行されなければならない。

  1. 呼び出されたメソッドに [WebGLHandlesContextLoss] 拡張属性が現れる場合、 呼び出されたメソッドの実装を実行し、その結果を返して、これらの手順を終了する。
  2. use default return value を false とする。
  3. webgl コンテキスト喪失フラグが設定されている場合、 use default return value を true とする。
    1. そうでなく、メソッドの任意の引数が、その invalidated フラグが設定された WebGLObject である場合、INVALID_OPERATION エラーを生成し、 use default return value を true とする。
  4. use default return value が true である場合、次の手順を実行する。
    1. 呼び出されたメソッドの戻り値型が any または任意の nullable 型である場合、 null を返す。
    2. メソッド実装を呼び出すことなく、このアルゴリズムを終了する。
  5. そうでなければ、呼び出されたメソッドの実装を実行し、その結果を返す。

さらなる詳細については、コンテキスト喪失イベントを参照。

typedef (ImageBitmap or
         ImageData or
         HTMLImageElement or
         HTMLCanvasElement or
         HTMLVideoElement or
         OffscreenCanvas or
         VideoFrame) TexImageSource;

typedef ([AllowShared] Float32Array or sequence<GLfloat>) Float32List;
typedef ([AllowShared] Int32Array or sequence<GLint>) Int32List;

interface mixin WebGLRenderingContextBase
{

    /* ClearBufferMask */
    const GLenum DEPTH_BUFFER_BIT               = 0x00000100;
    const GLenum STENCIL_BUFFER_BIT             = 0x00000400;
    const GLenum COLOR_BUFFER_BIT               = 0x00004000;

    /* BeginMode */
    const GLenum POINTS                         = 0x0000;
    const GLenum LINES                          = 0x0001;
    const GLenum LINE_LOOP                      = 0x0002;
    const GLenum LINE_STRIP                     = 0x0003;
    const GLenum TRIANGLES                      = 0x0004;
    const GLenum TRIANGLE_STRIP                 = 0x0005;
    const GLenum TRIANGLE_FAN                   = 0x0006;

    /* AlphaFunction (not supported in ES20) */
    /*      NEVER */
    /*      LESS */
    /*      EQUAL */
    /*      LEQUAL */
    /*      GREATER */
    /*      NOTEQUAL */
    /*      GEQUAL */
    /*      ALWAYS */

    /* BlendingFactorDest */
    const GLenum ZERO                           = 0;
    const GLenum ONE                            = 1;
    const GLenum SRC_COLOR                      = 0x0300;
    const GLenum ONE_MINUS_SRC_COLOR            = 0x0301;
    const GLenum SRC_ALPHA                      = 0x0302;
    const GLenum ONE_MINUS_SRC_ALPHA            = 0x0303;
    const GLenum DST_ALPHA                      = 0x0304;
    const GLenum ONE_MINUS_DST_ALPHA            = 0x0305;

    /* BlendingFactorSrc */
    /*      ZERO */
    /*      ONE */
    const GLenum DST_COLOR                      = 0x0306;
    const GLenum ONE_MINUS_DST_COLOR            = 0x0307;
    const GLenum SRC_ALPHA_SATURATE             = 0x0308;
    /*      SRC_ALPHA */
    /*      ONE_MINUS_SRC_ALPHA */
    /*      DST_ALPHA */
    /*      ONE_MINUS_DST_ALPHA */

    /* BlendEquationSeparate */
    const GLenum FUNC_ADD                       = 0x8006;
    const GLenum BLEND_EQUATION                 = 0x8009;
    const GLenum BLEND_EQUATION_RGB             = 0x8009;   /* same as BLEND_EQUATION */
    const GLenum BLEND_EQUATION_ALPHA           = 0x883D;

    /* BlendSubtract */
    const GLenum FUNC_SUBTRACT                  = 0x800A;
    const GLenum FUNC_REVERSE_SUBTRACT          = 0x800B;

    /* Separate Blend Functions */
    const GLenum BLEND_DST_RGB                  = 0x80C8;
    const GLenum BLEND_SRC_RGB                  = 0x80C9;
    const GLenum BLEND_DST_ALPHA                = 0x80CA;
    const GLenum BLEND_SRC_ALPHA                = 0x80CB;
    const GLenum CONSTANT_COLOR                 = 0x8001;
    const GLenum ONE_MINUS_CONSTANT_COLOR       = 0x8002;
    const GLenum CONSTANT_ALPHA                 = 0x8003;
    const GLenum ONE_MINUS_CONSTANT_ALPHA       = 0x8004;
    const GLenum BLEND_COLOR                    = 0x8005;

    /* Buffer Objects */
    const GLenum ARRAY_BUFFER                   = 0x8892;
    const GLenum ELEMENT_ARRAY_BUFFER           = 0x8893;
    const GLenum ARRAY_BUFFER_BINDING           = 0x8894;
    const GLenum ELEMENT_ARRAY_BUFFER_BINDING   = 0x8895;

    const GLenum STREAM_DRAW                    = 0x88E0;
    const GLenum STATIC_DRAW                    = 0x88E4;
    const GLenum DYNAMIC_DRAW                   = 0x88E8;

    const GLenum BUFFER_SIZE                    = 0x8764;
    const GLenum BUFFER_USAGE                   = 0x8765;

    const GLenum CURRENT_VERTEX_ATTRIB          = 0x8626;

    /* CullFaceMode */
    const GLenum FRONT                          = 0x0404;
    const GLenum BACK                           = 0x0405;
    const GLenum FRONT_AND_BACK                 = 0x0408;

    /* DepthFunction */
    /*      NEVER */
    /*      LESS */
    /*      EQUAL */
    /*      LEQUAL */
    /*      GREATER */
    /*      NOTEQUAL */
    /*      GEQUAL */
    /*      ALWAYS */

    /* EnableCap */
    /* TEXTURE_2D */
    const GLenum CULL_FACE                      = 0x0B44;
    const GLenum BLEND                          = 0x0BE2;
    const GLenum DITHER                         = 0x0BD0;
    const GLenum STENCIL_TEST                   = 0x0B90;
    const GLenum DEPTH_TEST                     = 0x0B71;
    const GLenum SCISSOR_TEST                   = 0x0C11;
    const GLenum POLYGON_OFFSET_FILL            = 0x8037;
    const GLenum SAMPLE_ALPHA_TO_COVERAGE       = 0x809E;
    const GLenum SAMPLE_COVERAGE                = 0x80A0;

    /* ErrorCode */
    const GLenum NO_ERROR                       = 0;
    const GLenum INVALID_ENUM                   = 0x0500;
    const GLenum INVALID_VALUE                  = 0x0501;
    const GLenum INVALID_OPERATION              = 0x0502;
    const GLenum OUT_OF_MEMORY                  = 0x0505;

    /* FrontFaceDirection */
    const GLenum CW                             = 0x0900;
    const GLenum CCW                            = 0x0901;

    /* GetPName */
    const GLenum LINE_WIDTH                     = 0x0B21;
    const GLenum ALIASED_POINT_SIZE_RANGE       = 0x846D;
    const GLenum ALIASED_LINE_WIDTH_RANGE       = 0x846E;
    const GLenum CULL_FACE_MODE                 = 0x0B45;
    const GLenum FRONT_FACE                     = 0x0B46;
    const GLenum DEPTH_RANGE                    = 0x0B70;
    const GLenum DEPTH_WRITEMASK                = 0x0B72;
    const GLenum DEPTH_CLEAR_VALUE              = 0x0B73;
    const GLenum DEPTH_FUNC                     = 0x0B74;
    const GLenum STENCIL_CLEAR_VALUE            = 0x0B91;
    const GLenum STENCIL_FUNC                   = 0x0B92;
    const GLenum STENCIL_FAIL                   = 0x0B94;
    const GLenum STENCIL_PASS_DEPTH_FAIL        = 0x0B95;
    const GLenum STENCIL_PASS_DEPTH_PASS        = 0x0B96;
    const GLenum STENCIL_REF                    = 0x0B97;
    const GLenum STENCIL_VALUE_MASK             = 0x0B93;
    const GLenum STENCIL_WRITEMASK              = 0x0B98;
    const GLenum STENCIL_BACK_FUNC              = 0x8800;
    const GLenum STENCIL_BACK_FAIL              = 0x8801;
    const GLenum STENCIL_BACK_PASS_DEPTH_FAIL   = 0x8802;
    const GLenum STENCIL_BACK_PASS_DEPTH_PASS   = 0x8803;
    const GLenum STENCIL_BACK_REF               = 0x8CA3;
    const GLenum STENCIL_BACK_VALUE_MASK        = 0x8CA4;
    const GLenum STENCIL_BACK_WRITEMASK         = 0x8CA5;
    const GLenum VIEWPORT                       = 0x0BA2;
    const GLenum SCISSOR_BOX                    = 0x0C10;
    /*      SCISSOR_TEST */
    const GLenum COLOR_CLEAR_VALUE              = 0x0C22;
    const GLenum COLOR_WRITEMASK                = 0x0C23;
    const GLenum UNPACK_ALIGNMENT               = 0x0CF5;
    const GLenum PACK_ALIGNMENT                 = 0x0D05;
    const GLenum MAX_TEXTURE_SIZE               = 0x0D33;
    const GLenum MAX_VIEWPORT_DIMS              = 0x0D3A;
    const GLenum SUBPIXEL_BITS                  = 0x0D50;
    const GLenum RED_BITS                       = 0x0D52;
    const GLenum GREEN_BITS                     = 0x0D53;
    const GLenum BLUE_BITS                      = 0x0D54;
    const GLenum ALPHA_BITS                     = 0x0D55;
    const GLenum DEPTH_BITS                     = 0x0D56;
    const GLenum STENCIL_BITS                   = 0x0D57;
    const GLenum POLYGON_OFFSET_UNITS           = 0x2A00;
    /*      POLYGON_OFFSET_FILL */
    const GLenum POLYGON_OFFSET_FACTOR          = 0x8038;
    const GLenum TEXTURE_BINDING_2D             = 0x8069;
    const GLenum SAMPLE_BUFFERS                 = 0x80A8;
    const GLenum SAMPLES                        = 0x80A9;
    const GLenum SAMPLE_COVERAGE_VALUE          = 0x80AA;
    const GLenum SAMPLE_COVERAGE_INVERT         = 0x80AB;

    /* GetTextureParameter */
    /*      TEXTURE_MAG_FILTER */
    /*      TEXTURE_MIN_FILTER */
    /*      TEXTURE_WRAP_S */
    /*      TEXTURE_WRAP_T */

    const GLenum COMPRESSED_TEXTURE_FORMATS     = 0x86A3;

    /* HintMode */
    const GLenum DONT_CARE                      = 0x1100;
    const GLenum FASTEST                        = 0x1101;
    const GLenum NICEST                         = 0x1102;

    /* HintTarget */
    const GLenum GENERATE_MIPMAP_HINT            = 0x8192;

    /* DataType */
    const GLenum BYTE                           = 0x1400;
    const GLenum UNSIGNED_BYTE                  = 0x1401;
    const GLenum SHORT                          = 0x1402;
    const GLenum UNSIGNED_SHORT                 = 0x1403;
    const GLenum INT                            = 0x1404;
    const GLenum UNSIGNED_INT                   = 0x1405;
    const GLenum FLOAT                          = 0x1406;

    /* PixelFormat */
    const GLenum DEPTH_COMPONENT                = 0x1902;
    const GLenum ALPHA                          = 0x1906;
    const GLenum RGB                            = 0x1907;
    const GLenum RGBA                           = 0x1908;
    const GLenum LUMINANCE                      = 0x1909;
    const GLenum LUMINANCE_ALPHA                = 0x190A;

    /* PixelType */
    /*      UNSIGNED_BYTE */
    const GLenum UNSIGNED_SHORT_4_4_4_4         = 0x8033;
    const GLenum UNSIGNED_SHORT_5_5_5_1         = 0x8034;
    const GLenum UNSIGNED_SHORT_5_6_5           = 0x8363;

    /* Shaders */
    const GLenum FRAGMENT_SHADER                  = 0x8B30;
    const GLenum VERTEX_SHADER                    = 0x8B31;
    const GLenum MAX_VERTEX_ATTRIBS               = 0x8869;
    const GLenum MAX_VERTEX_UNIFORM_VECTORS       = 0x8DFB;
    const GLenum MAX_VARYING_VECTORS              = 0x8DFC;
    const GLenum MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
    const GLenum MAX_VERTEX_TEXTURE_IMAGE_UNITS   = 0x8B4C;
    const GLenum MAX_TEXTURE_IMAGE_UNITS          = 0x8872;
    const GLenum MAX_FRAGMENT_UNIFORM_VECTORS     = 0x8DFD;
    const GLenum SHADER_TYPE                      = 0x8B4F;
    const GLenum DELETE_STATUS                    = 0x8B80;
    const GLenum LINK_STATUS                      = 0x8B82;
    const GLenum VALIDATE_STATUS                  = 0x8B83;
    const GLenum ATTACHED_SHADERS                 = 0x8B85;
    const GLenum ACTIVE_UNIFORMS                  = 0x8B86;
    const GLenum ACTIVE_ATTRIBUTES                = 0x8B89;
    const GLenum SHADING_LANGUAGE_VERSION         = 0x8B8C;
    const GLenum CURRENT_PROGRAM                  = 0x8B8D;

    /* StencilFunction */
    const GLenum NEVER                          = 0x0200;
    const GLenum LESS                           = 0x0201;
    const GLenum EQUAL                          = 0x0202;
    const GLenum LEQUAL                         = 0x0203;
    const GLenum GREATER                        = 0x0204;
    const GLenum NOTEQUAL                       = 0x0205;
    const GLenum GEQUAL                         = 0x0206;
    const GLenum ALWAYS                         = 0x0207;

    /* StencilOp */
    /*      ZERO */
    const GLenum KEEP                           = 0x1E00;
    const GLenum REPLACE                        = 0x1E01;
    const GLenum INCR                           = 0x1E02;
    const GLenum DECR                           = 0x1E03;
    const GLenum INVERT                         = 0x150A;
    const GLenum INCR_WRAP                      = 0x8507;
    const GLenum DECR_WRAP                      = 0x8508;

    /* StringName */
    const GLenum VENDOR                         = 0x1F00;
    const GLenum RENDERER                       = 0x1F01;
    const GLenum VERSION                        = 0x1F02;

    /* TextureMagFilter */
    const GLenum NEAREST                        = 0x2600;
    const GLenum LINEAR                         = 0x2601;

    /* TextureMinFilter */
    /*      NEAREST */
    /*      LINEAR */
    const GLenum NEAREST_MIPMAP_NEAREST         = 0x2700;
    const GLenum LINEAR_MIPMAP_NEAREST          = 0x2701;
    const GLenum NEAREST_MIPMAP_LINEAR          = 0x2702;
    const GLenum LINEAR_MIPMAP_LINEAR           = 0x2703;

    /* TextureParameterName */
    const GLenum TEXTURE_MAG_FILTER             = 0x2800;
    const GLenum TEXTURE_MIN_FILTER             = 0x2801;
    const GLenum TEXTURE_WRAP_S                 = 0x2802;
    const GLenum TEXTURE_WRAP_T                 = 0x2803;

    /* TextureTarget */
    const GLenum TEXTURE_2D                     = 0x0DE1;
    const GLenum TEXTURE                        = 0x1702;

    const GLenum TEXTURE_CUBE_MAP               = 0x8513;
    const GLenum TEXTURE_BINDING_CUBE_MAP       = 0x8514;
    const GLenum TEXTURE_CUBE_MAP_POSITIVE_X    = 0x8515;
    const GLenum TEXTURE_CUBE_MAP_NEGATIVE_X    = 0x8516;
    const GLenum TEXTURE_CUBE_MAP_POSITIVE_Y    = 0x8517;
    const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Y    = 0x8518;
    const GLenum TEXTURE_CUBE_MAP_POSITIVE_Z    = 0x8519;
    const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Z    = 0x851A;
    const GLenum MAX_CUBE_MAP_TEXTURE_SIZE      = 0x851C;

    /* TextureUnit */
    const GLenum TEXTURE0                       = 0x84C0;
    const GLenum TEXTURE1                       = 0x84C1;
    const GLenum TEXTURE2                       = 0x84C2;
    const GLenum TEXTURE3                       = 0x84C3;
    const GLenum TEXTURE4                       = 0x84C4;
    const GLenum TEXTURE5                       = 0x84C5;
    const GLenum TEXTURE6                       = 0x84C6;
    const GLenum TEXTURE7                       = 0x84C7;
    const GLenum TEXTURE8                       = 0x84C8;
    const GLenum TEXTURE9                       = 0x84C9;
    const GLenum TEXTURE10                      = 0x84CA;
    const GLenum TEXTURE11                      = 0x84CB;
    const GLenum TEXTURE12                      = 0x84CC;
    const GLenum TEXTURE13                      = 0x84CD;
    const GLenum TEXTURE14                      = 0x84CE;
    const GLenum TEXTURE15                      = 0x84CF;
    const GLenum TEXTURE16                      = 0x84D0;
    const GLenum TEXTURE17                      = 0x84D1;
    const GLenum TEXTURE18                      = 0x84D2;
    const GLenum TEXTURE19                      = 0x84D3;
    const GLenum TEXTURE20                      = 0x84D4;
    const GLenum TEXTURE21                      = 0x84D5;
    const GLenum TEXTURE22                      = 0x84D6;
    const GLenum TEXTURE23                      = 0x84D7;
    const GLenum TEXTURE24                      = 0x84D8;
    const GLenum TEXTURE25                      = 0x84D9;
    const GLenum TEXTURE26                      = 0x84DA;
    const GLenum TEXTURE27                      = 0x84DB;
    const GLenum TEXTURE28                      = 0x84DC;
    const GLenum TEXTURE29                      = 0x84DD;
    const GLenum TEXTURE30                      = 0x84DE;
    const GLenum TEXTURE31                      = 0x84DF;
    const GLenum ACTIVE_TEXTURE                 = 0x84E0;

    /* TextureWrapMode */
    const GLenum REPEAT                         = 0x2901;
    const GLenum CLAMP_TO_EDGE                  = 0x812F;
    const GLenum MIRRORED_REPEAT                = 0x8370;

    /* Uniform Types */
    const GLenum FLOAT_VEC2                     = 0x8B50;
    const GLenum FLOAT_VEC3                     = 0x8B51;
    const GLenum FLOAT_VEC4                     = 0x8B52;
    const GLenum INT_VEC2                       = 0x8B53;
    const GLenum INT_VEC3                       = 0x8B54;
    const GLenum INT_VEC4                       = 0x8B55;
    const GLenum BOOL                           = 0x8B56;
    const GLenum BOOL_VEC2                      = 0x8B57;
    const GLenum BOOL_VEC3                      = 0x8B58;
    const GLenum BOOL_VEC4                      = 0x8B59;
    const GLenum FLOAT_MAT2                     = 0x8B5A;
    const GLenum FLOAT_MAT3                     = 0x8B5B;
    const GLenum FLOAT_MAT4                     = 0x8B5C;
    const GLenum SAMPLER_2D                     = 0x8B5E;
    const GLenum SAMPLER_CUBE                   = 0x8B60;

    /* Vertex Arrays */
    const GLenum VERTEX_ATTRIB_ARRAY_ENABLED        = 0x8622;
    const GLenum VERTEX_ATTRIB_ARRAY_SIZE           = 0x8623;
    const GLenum VERTEX_ATTRIB_ARRAY_STRIDE         = 0x8624;
    const GLenum VERTEX_ATTRIB_ARRAY_TYPE           = 0x8625;
    const GLenum VERTEX_ATTRIB_ARRAY_NORMALIZED     = 0x886A;
    const GLenum VERTEX_ATTRIB_ARRAY_POINTER        = 0x8645;
    const GLenum VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;

    /* Read Format */
    const GLenum IMPLEMENTATION_COLOR_READ_TYPE   = 0x8B9A;
    const GLenum IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;

    /* Shader Source */
    const GLenum COMPILE_STATUS                 = 0x8B81;

    /* Shader Precision-Specified Types */
    const GLenum LOW_FLOAT                      = 0x8DF0;
    const GLenum MEDIUM_FLOAT                   = 0x8DF1;
    const GLenum HIGH_FLOAT                     = 0x8DF2;
    const GLenum LOW_INT                        = 0x8DF3;
    const GLenum MEDIUM_INT                     = 0x8DF4;
    const GLenum HIGH_INT                       = 0x8DF5;

    /* Framebuffer Object. */
    const GLenum FRAMEBUFFER                    = 0x8D40;
    const GLenum RENDERBUFFER                   = 0x8D41;

    const GLenum RGBA4                          = 0x8056;
    const GLenum RGB5_A1                        = 0x8057;
    const GLenum RGBA8                          = 0x8058;
    const GLenum RGB565                         = 0x8D62;
    const GLenum DEPTH_COMPONENT16              = 0x81A5;
    const GLenum STENCIL_INDEX8                 = 0x8D48;
    const GLenum DEPTH_STENCIL                  = 0x84F9;

    const GLenum RENDERBUFFER_WIDTH             = 0x8D42;
    const GLenum RENDERBUFFER_HEIGHT            = 0x8D43;
    const GLenum RENDERBUFFER_INTERNAL_FORMAT   = 0x8D44;
    const GLenum RENDERBUFFER_RED_SIZE          = 0x8D50;
    const GLenum RENDERBUFFER_GREEN_SIZE        = 0x8D51;
    const GLenum RENDERBUFFER_BLUE_SIZE         = 0x8D52;
    const GLenum RENDERBUFFER_ALPHA_SIZE        = 0x8D53;
    const GLenum RENDERBUFFER_DEPTH_SIZE        = 0x8D54;
    const GLenum RENDERBUFFER_STENCIL_SIZE      = 0x8D55;

    const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           = 0x8CD0;
    const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           = 0x8CD1;
    const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         = 0x8CD2;
    const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;

    const GLenum COLOR_ATTACHMENT0              = 0x8CE0;
    const GLenum DEPTH_ATTACHMENT               = 0x8D00;
    const GLenum STENCIL_ATTACHMENT             = 0x8D20;
    const GLenum DEPTH_STENCIL_ATTACHMENT       = 0x821A;

    const GLenum NONE                           = 0;

    const GLenum FRAMEBUFFER_COMPLETE                      = 0x8CD5;
    const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT         = 0x8CD6;
    const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
    const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS         = 0x8CD9;
    const GLenum FRAMEBUFFER_UNSUPPORTED                   = 0x8CDD;

    const GLenum FRAMEBUFFER_BINDING            = 0x8CA6;
    const GLenum RENDERBUFFER_BINDING           = 0x8CA7;
    const GLenum MAX_RENDERBUFFER_SIZE          = 0x84E8;

    const GLenum INVALID_FRAMEBUFFER_OPERATION  = 0x0506;

    /* WebGL-specific enums */
    const GLenum UNPACK_FLIP_Y_WEBGL            = 0x9240;
    const GLenum UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
    const GLenum CONTEXT_LOST_WEBGL             = 0x9242;
    const GLenum UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
    const GLenum BROWSER_DEFAULT_WEBGL          = 0x9244;

    readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
    readonly attribute GLsizei drawingBufferWidth;
    readonly attribute GLsizei drawingBufferHeight;
    readonly attribute GLenum drawingBufferFormat;

    /* Upon context creation, drawingBufferColorSpace and unpackColorSpace both
       default to the value "srgb". */
    attribute PredefinedColorSpace drawingBufferColorSpace;
    attribute PredefinedColorSpace unpackColorSpace;

    [WebGLHandlesContextLoss] WebGLContextAttributes? getContextAttributes();
    [WebGLHandlesContextLoss] boolean isContextLost();

    sequence<DOMString>? getSupportedExtensions();
    object? getExtension(DOMString name);

    undefined drawingBufferStorage(GLenum sizedFormat, unsigned long width, unsigned long height);

    undefined activeTexture(GLenum texture);
    undefined attachShader(WebGLProgram program, WebGLShader shader);
    undefined bindAttribLocation(WebGLProgram program, GLuint index, DOMString name);
    undefined bindBuffer(GLenum target, WebGLBuffer? buffer);
    undefined bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer);
    undefined bindRenderbuffer(GLenum target, WebGLRenderbuffer? renderbuffer);
    undefined bindTexture(GLenum target, WebGLTexture? texture);
    undefined blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
    undefined blendEquation(GLenum mode);
    undefined blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
    undefined blendFunc(GLenum sfactor, GLenum dfactor);
    undefined blendFuncSeparate(GLenum srcRGB, GLenum dstRGB,
                                GLenum srcAlpha, GLenum dstAlpha);

    [WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target);
    undefined clear(GLbitfield mask);
    undefined clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
    undefined clearDepth(GLclampf depth);
    undefined clearStencil(GLint s);
    undefined colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
    undefined compileShader(WebGLShader shader);

    undefined copyTexImage2D(GLenum target, GLint level, GLenum internalformat,
                             GLint x, GLint y, GLsizei width, GLsizei height,
                             GLint border);
    undefined copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                                GLint x, GLint y, GLsizei width, GLsizei height);

    WebGLBuffer createBuffer();
    WebGLFramebuffer createFramebuffer();
    WebGLProgram createProgram();
    WebGLRenderbuffer createRenderbuffer();
    WebGLShader? createShader(GLenum type);
    WebGLTexture createTexture();

    undefined cullFace(GLenum mode);

    undefined deleteBuffer(WebGLBuffer? buffer);
    undefined deleteFramebuffer(WebGLFramebuffer? framebuffer);
    undefined deleteProgram(WebGLProgram? program);
    undefined deleteRenderbuffer(WebGLRenderbuffer? renderbuffer);
    undefined deleteShader(WebGLShader? shader);
    undefined deleteTexture(WebGLTexture? texture);

    undefined depthFunc(GLenum func);
    undefined depthMask(GLboolean flag);
    undefined depthRange(GLclampf zNear, GLclampf zFar);
    undefined detachShader(WebGLProgram program, WebGLShader shader);
    undefined disable(GLenum cap);
    undefined disableVertexAttribArray(GLuint index);
    undefined drawArrays(GLenum mode, GLint first, GLsizei count);
    undefined drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset);

    undefined enable(GLenum cap);
    undefined enableVertexAttribArray(GLuint index);
    undefined finish();
    undefined flush();
    undefined framebufferRenderbuffer(GLenum target, GLenum attachment,
                                      GLenum renderbuffertarget,
                                      WebGLRenderbuffer? renderbuffer);
    undefined framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget,
                                   WebGLTexture? texture, GLint level);
    undefined frontFace(GLenum mode);

    undefined generateMipmap(GLenum target);

    WebGLActiveInfo? getActiveAttrib(WebGLProgram program, GLuint index);
    WebGLActiveInfo? getActiveUniform(WebGLProgram program, GLuint index);
    sequence<WebGLShader>? getAttachedShaders(WebGLProgram program);

    [WebGLHandlesContextLoss] GLint getAttribLocation(WebGLProgram program, DOMString name);

    any getBufferParameter(GLenum target, GLenum pname);
    any getParameter(GLenum pname);

    [WebGLHandlesContextLoss] GLenum getError();

    any getFramebufferAttachmentParameter(GLenum target, GLenum attachment,
                                          GLenum pname);
    any getProgramParameter(WebGLProgram program, GLenum pname);
    DOMString? getProgramInfoLog(WebGLProgram program);
    any getRenderbufferParameter(GLenum target, GLenum pname);
    any getShaderParameter(WebGLShader shader, GLenum pname);
    WebGLShaderPrecisionFormat? getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype);
    DOMString? getShaderInfoLog(WebGLShader shader);

    DOMString? getShaderSource(WebGLShader shader);

    any getTexParameter(GLenum target, GLenum pname);

    any getUniform(WebGLProgram program, WebGLUniformLocation location);

    WebGLUniformLocation? getUniformLocation(WebGLProgram program, DOMString name);

    any getVertexAttrib(GLuint index, GLenum pname);

    [WebGLHandlesContextLoss] GLintptr getVertexAttribOffset(GLuint index, GLenum pname);

    undefined hint(GLenum target, GLenum mode);
    [WebGLHandlesContextLoss] GLboolean isBuffer(WebGLBuffer? buffer);
    [WebGLHandlesContextLoss] GLboolean isEnabled(GLenum cap);
    [WebGLHandlesContextLoss] GLboolean isFramebuffer(WebGLFramebuffer? framebuffer);
    [WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program);
    [WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer);
    [WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader);
    [WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture);
    undefined lineWidth(GLfloat width);
    undefined linkProgram(WebGLProgram program);
    undefined pixelStorei(GLenum pname, GLint param);
    undefined polygonOffset(GLfloat factor, GLfloat units);

    undefined renderbufferStorage(GLenum target, GLenum internalformat,
                                  GLsizei width, GLsizei height);
    undefined sampleCoverage(GLclampf value, GLboolean invert);
    undefined scissor(GLint x, GLint y, GLsizei width, GLsizei height);

    undefined shaderSource(WebGLShader shader, DOMString source);

    undefined stencilFunc(GLenum func, GLint ref, GLuint mask);
    undefined stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
    undefined stencilMask(GLuint mask);
    undefined stencilMaskSeparate(GLenum face, GLuint mask);
    undefined stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
    undefined stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);

    undefined texParameterf(GLenum target, GLenum pname, GLfloat param);
    undefined texParameteri(GLenum target, GLenum pname, GLint param);

    undefined uniform1f(WebGLUniformLocation? location, GLfloat x);
    undefined uniform2f(WebGLUniformLocation? location, GLfloat x, GLfloat y);
    undefined uniform3f(WebGLUniformLocation? location, GLfloat x, GLfloat y, GLfloat z);
    undefined uniform4f(WebGLUniformLocation? location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);

    undefined uniform1i(WebGLUniformLocation? location, GLint x);
    undefined uniform2i(WebGLUniformLocation? location, GLint x, GLint y);
    undefined uniform3i(WebGLUniformLocation? location, GLint x, GLint y, GLint z);
    undefined uniform4i(WebGLUniformLocation? location, GLint x, GLint y, GLint z, GLint w);

    undefined useProgram(WebGLProgram? program);
    undefined validateProgram(WebGLProgram program);

    undefined vertexAttrib1f(GLuint index, GLfloat x);
    undefined vertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
    undefined vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
    undefined vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);

    undefined vertexAttrib1fv(GLuint index, Float32List values);
    undefined vertexAttrib2fv(GLuint index, Float32List values);
    undefined vertexAttrib3fv(GLuint index, Float32List values);
    undefined vertexAttrib4fv(GLuint index, Float32List values);

    undefined vertexAttribPointer(GLuint index, GLint size, GLenum type,
                                  GLboolean normalized, GLsizei stride, GLintptr offset);

    undefined viewport(GLint x, GLint y, GLsizei width, GLsizei height);
};

interface mixin WebGLRenderingContextOverloads
{
    undefined bufferData(GLenum target, GLsizeiptr size, GLenum usage);
    undefined bufferData(GLenum target, AllowSharedBufferSource? data, GLenum usage);
    undefined bufferSubData(GLenum target, GLintptr offset, AllowSharedBufferSource data);

    undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,
                                   GLsizei width, GLsizei height, GLint border,
                                   [AllowShared] ArrayBufferView data);
    undefined compressedTexSubImage2D(GLenum target, GLint level,
                                      GLint xoffset, GLint yoffset,
                                      GLsizei width, GLsizei height, GLenum format,
                                      [AllowShared] ArrayBufferView data);

    undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
                         GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);

    undefined texImage2D(GLenum target, GLint level, GLint internalformat,
                         GLsizei width, GLsizei height, GLint border, GLenum format,
                         GLenum type, [AllowShared] ArrayBufferView? pixels);
    undefined texImage2D(GLenum target, GLint level, GLint internalformat,
                         GLenum format, GLenum type, TexImageSource source); // May throw DOMException

    undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                            GLsizei width, GLsizei height,
                            GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
    undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                            GLenum format, GLenum type, TexImageSource source); // May throw DOMException

    undefined uniform1fv(WebGLUniformLocation? location, Float32List v);
    undefined uniform2fv(WebGLUniformLocation? location, Float32List v);
    undefined uniform3fv(WebGLUniformLocation? location, Float32List v);
    undefined uniform4fv(WebGLUniformLocation? location, Float32List v);

    undefined uniform1iv(WebGLUniformLocation? location, Int32List v);
    undefined uniform2iv(WebGLUniformLocation? location, Int32List v);
    undefined uniform3iv(WebGLUniformLocation? location, Int32List v);
    undefined uniform4iv(WebGLUniformLocation? location, Int32List v);

    undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value);
    undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value);
    undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value);
};

[Exposed=(Window,Worker)]
interface WebGLRenderingContext
{
};
WebGLRenderingContext includes WebGLRenderingContextBase;
WebGLRenderingContext includes WebGLRenderingContextOverloads;

属性

次の属性が利用できる。

canvas 型は (HTMLCanvasElement or OffscreenCanvas)
このコンテキストを作成した canvas 要素または OffscreenCanvas オブジェクトへの参照。
drawingBufferWidth 型は GLsizei
描画バッファの実際の幅。実装が要求された width または height を満たせない場合、 HTMLCanvasElementwidth 属性とは異なる場合がある。
drawingBufferHeight 型は GLsizei
描画バッファの実際の高さ。実装が要求された width または height を満たせない場合、 HTMLCanvasElementheight 属性とは異なる場合がある。
drawingBufferFormat 型は GLenum
描画バッファの現在の有効な形式。 初期状態では、alpha:true および alpha:false に対して それぞれ RGBA8 または RGB8 である。
drawingBufferColorSpace 型は PredefinedColorSpace (仕様)
描画バッファの内容値を解釈するために使用される色空間。 この属性を変更すると、描画バッファは再割り当てされ、その現在の内容は失われる。 この属性は、レンダリングコンテキストの画面上表示、およびこのコンテキストの 描画バッファが 2D canvas コンテキストへ描画される場合、または別の WebGL もしくは WebGPU レンダリングコンテキスト内のテクスチャへ アップロードされる場合の解釈に影響する。
unpackColorSpace 型は PredefinedColorSpace (仕様)
このコンテキスト内のテクスチャへアップロードする際に、 TexImageSource ソースが変換される先の色空間。

コンテキストに関する情報の取得

[WebGLHandlesContextLoss] WebGLContextAttributes? getContextAttributes()
webgl コンテキスト喪失フラグが設定されている場合、 null を返す。そうでなければ、 実際のコンテキストパラメーターのコピーを返す。

状態の設定と取得

OpenGL ES 2.0 は、レンダリングで使用するための状態値を保持する。 このグループ内のすべての呼び出しは、特に注記がない限り、 対応する OpenGL のものと同一に振る舞う。

void activeTexture(GLenum texture) OpenGL ES 2.0 §3.7man ページ
void blendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) OpenGL ES 2.0 §4.1.6man ページ
WebGL 1.0 では、EXT_color_buffer_half_float または WEBGL_color_buffer_float が 有効でない限り、blendColor はその引数を 0 から 1 の範囲にクランプする。
void blendEquation(GLenum mode) OpenGL ES 2.0 §4.1.6man ページ
void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) OpenGL ES 2.0 §4.1.6man ページ
void blendFunc(GLenum sfactor, GLenum dfactor) OpenGL ES 2.0 §4.1.6man ページ
WebGL によって課される制限については、 定数色によるブレンディングを参照。
void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) OpenGL ES 2.0 §4.1.6man ページ
WebGL によって課される制限については、 定数色によるブレンディングを参照。
void clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) OpenGL ES 2.0 §4.2.3man ページ
void clearDepth(GLclampf depth) OpenGL ES 2.0 §4.2.3man ページ
depth 値は 0 から 1 の範囲にクランプされる。
void clearStencil(GLint s) OpenGL ES 2.0 §4.2.3man ページ
void colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) OpenGL ES 2.0 §4.2.2man ページ
void cullFace(GLenum mode) OpenGL ES 2.0 §3.5.1man ページ
void depthFunc(GLenum func) OpenGL ES 2.0 §4.1.5man ページ
void depthMask(GLboolean flag) OpenGL ES 2.0 §4.2.2man ページ
void depthRange(GLclampf zNear, GLclampf zFar) OpenGL ES 2.0 §2.12.1man ページ
zNear および zFar の値は 0 から 1 の範囲にクランプされ、 zNearzFar 以下でなければならない。 ビューポート深度範囲を参照。
void disable(GLenum cap) man ページ
void enable(GLenum cap) man ページ
void frontFace(GLenum mode) OpenGL ES 2.0 §3.5.1man ページ
any getParameter(GLenum pname) (glGet OpenGL ES 2.0 man ページ) (glGetString OpenGL ES 2.0 man ページ)
渡された pname に対する値を返す。返される型は、次の表で示されるように、 要求された pname に対する自然な型である。
pname 返される型
ACTIVE_TEXTURE GLenum
ALIASED_LINE_WIDTH_RANGE Float32Array(2 要素)
ALIASED_POINT_SIZE_RANGE Float32Array(2 要素)
ALPHA_BITS GLint
ARRAY_BUFFER_BINDING WebGLBuffer
BLEND GLboolean
BLEND_COLOR Float32Array(4 個の値)
BLEND_DST_ALPHA GLenum
BLEND_DST_RGB GLenum
BLEND_EQUATION_ALPHA GLenum
BLEND_EQUATION_RGB GLenum
BLEND_SRC_ALPHA GLenum
BLEND_SRC_RGB GLenum
BLUE_BITS GLint
COLOR_CLEAR_VALUE Float32Array(4 個の値)
COLOR_WRITEMASK sequence<GLboolean>(4 個の値)
COMPRESSED_TEXTURE_FORMATS Uint32Array
CULL_FACE GLboolean
CULL_FACE_MODE GLenum
CURRENT_PROGRAM WebGLProgram
DEPTH_BITS GLint
DEPTH_CLEAR_VALUE GLfloat
DEPTH_FUNC GLenum
DEPTH_RANGE Float32Array(2 要素)
DEPTH_TEST GLboolean
DEPTH_WRITEMASK GLboolean
DITHER GLboolean
ELEMENT_ARRAY_BUFFER_BINDING WebGLBuffer
FRAMEBUFFER_BINDING WebGLFramebuffer
FRONT_FACE GLenum
GENERATE_MIPMAP_HINT GLenum
GREEN_BITS GLint
IMPLEMENTATION_COLOR_READ_FORMAT GLenum
IMPLEMENTATION_COLOR_READ_TYPE GLenum
LINE_WIDTH GLfloat
MAX_COMBINED_TEXTURE_IMAGE_UNITS GLint
MAX_CUBE_MAP_TEXTURE_SIZE GLint
MAX_FRAGMENT_UNIFORM_VECTORS GLint
MAX_RENDERBUFFER_SIZE GLint
MAX_TEXTURE_IMAGE_UNITS GLint
MAX_TEXTURE_SIZE GLint
MAX_VARYING_VECTORS GLint
MAX_VERTEX_ATTRIBS GLint
MAX_VERTEX_TEXTURE_IMAGE_UNITS GLint
MAX_VERTEX_UNIFORM_VECTORS GLint
MAX_VIEWPORT_DIMS Int32Array(2 要素)
PACK_ALIGNMENT GLint
POLYGON_OFFSET_FACTOR GLfloat
POLYGON_OFFSET_FILL GLboolean
POLYGON_OFFSET_UNITS GLfloat
RED_BITS GLint
RENDERBUFFER_BINDING WebGLRenderbuffer
RENDERER DOMString
SAMPLE_ALPHA_TO_COVERAGE GLboolean
SAMPLE_BUFFERS GLint
SAMPLE_COVERAGE GLboolean
SAMPLE_COVERAGE_INVERT GLboolean
SAMPLE_COVERAGE_VALUE GLfloat
SAMPLES GLint
SCISSOR_BOX Int32Array(4 要素)
SCISSOR_TEST GLboolean
SHADING_LANGUAGE_VERSION DOMString
STENCIL_BACK_FAIL GLenum
STENCIL_BACK_FUNC GLenum
STENCIL_BACK_PASS_DEPTH_FAIL GLenum
STENCIL_BACK_PASS_DEPTH_PASS GLenum
STENCIL_BACK_REF GLint
STENCIL_BACK_VALUE_MASK GLuint
STENCIL_BACK_WRITEMASK GLuint
STENCIL_BITS GLint
STENCIL_CLEAR_VALUE GLint
STENCIL_FAIL GLenum
STENCIL_FUNC GLenum
STENCIL_PASS_DEPTH_FAIL GLenum
STENCIL_PASS_DEPTH_PASS GLenum
STENCIL_REF GLint
STENCIL_TEST GLboolean
STENCIL_VALUE_MASK GLuint
STENCIL_WRITEMASK GLuint
SUBPIXEL_BITS GLint
TEXTURE_BINDING_2D WebGLTexture
TEXTURE_BINDING_CUBE_MAP WebGLTexture
UNPACK_ALIGNMENT GLint
UNPACK_COLORSPACE_CONVERSION_WEBGL GLenum
UNPACK_FLIP_Y_WEBGL GLboolean
UNPACK_PREMULTIPLY_ALPHA_WEBGL GLboolean
VENDOR DOMString
VERSION DOMString
VIEWPORT Int32Array(4 要素)

シーケンスまたは typed arrays を返すすべての問い合わせは、毎回新しいオブジェクトを返す。

pname が上の表にない場合、INVALID_ENUM エラーを生成し、 null を返す。

pnameIMPLEMENTATION_COLOR_READ_FORMAT または IMPLEMENTATION_COLOR_READ_TYPE であり、現在バインドされている framebuffer が framebuffer complete でない場合、 INVALID_OPERATION エラーを生成し、null を返す。

次の pname 引数は、現在の WebGL 実装のある側面を記述する文字列を返す。

VERSION WebGL<space>1.0<optional><space><vendor-specific information></optional> という形式のバージョンまたはリリース番号を返す。
SHADING_LANGUAGE_VERSION WebGL<space>GLSL<space>ES<space>1.0<optional><space><vendor-specific information></optional> という形式のバージョンまたはリリース番号を返す。
VENDOR この WebGL 実装に責任を持つ会社を返す。この名前はリリースごとに変わらない。
RENDERER レンダラーの名前を返す。この名前は通常、ハードウェアプラットフォームの 特定の構成に固有である。これはリリースごとに変わらない。

現在の WebGL 実装で利用可能な拡張を問い合わせることに関する情報については、 拡張の問い合わせを参照。

[WebGLHandlesContextLoss] GLenum getError() OpenGL ES 2.0 §2.5man ページ
コンテキストの webgl コンテキスト喪失フラグが 設定されている場合、このメソッドが最初に呼び出されたときに CONTEXT_LOST_WEBGL を返す。その後は、コンテキストが 復元されるまで NO_ERROR を返す。
void hint(GLenum target, GLenum mode) OpenGL ES 2.0 §5.2man ページ
[WebGLHandlesContextLoss] GLboolean isEnabled(GLenum cap) OpenGL ES 2.0 §6.1.1man ページ
任意の isEnabled 問い合わせについて、同じ boolean 値は getParameter によって取得できる。

コンテキストの webgl コンテキスト喪失 フラグが設定されている場合は false を返す。
void lineWidth(GLfloat width) OpenGL ES 2.0 §3.4man ページ
WebGL に対して指定される制限については、 NaN Line Widthを参照。
void pixelStorei(GLenum pname, GLint param) OpenGL ES 2.0 §3.6.1man ページ
OpenGL ES 2.0 仕様のパラメーターに加えて、WebGL 仕様は UNPACK_FLIP_Y_WEBGLUNPACK_PREMULTIPLY_ALPHA_WEBGL および UNPACK_COLORSPACE_CONVERSION_WEBGL パラメーターを受け入れる。 これらのパラメーターの説明については、 ピクセルストレージパラメーターを参照。
void polygonOffset(GLfloat factor, GLfloat units) OpenGL ES 2.0 §3.5.2man ページ
void sampleCoverage(GLclampf value, GLboolean invert) OpenGL ES 2.0 §4.1.3man ページ
void stencilFunc(GLenum func, GLint ref, GLuint mask) OpenGL ES 2.0 §4.1.4man ページ
void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) OpenGL ES 2.0 §4.1.4man ページ
許可される引数値に対する WebGL 固有の制限に関する情報については、 ステンシルの分離マスクと参照値を参照。
void stencilMask(GLuint mask) OpenGL ES 2.0 §4.2.2man ページ
許可される mask 値に対する WebGL 固有の制限に関する情報については、 ステンシルの分離マスクと参照値を参照。
void stencilMaskSeparate(GLenum face, GLuint mask) OpenGL ES 2.0 §4.2.2man ページ
void stencilOp(GLenum fail, GLenum zfail, GLenum zpass) OpenGL ES 2.0 §4.1.4man ページ
void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) OpenGL ES 2.0 §4.1.4man ページ

表示とクリッピング

描画コマンドは、現在バインドされている framebuffer 内のピクセルのみを変更できる。 加えて、viewport および scissor box は描画に影響する。

viewport は、正規化デバイス座標からウィンドウ座標への x および y の アフィン変換を指定する。viewport のサイズは、 WebGL ビューポートの節で指定されるように初期決定される。 scissor box は、描画を制約する矩形を定義する。scissor test が有効な場合、 clear を含む描画コマンドによって変更できるのは scissor box 内にある ピクセルのみであり、プリミティブは viewport、現在バインドされている framebuffer、 および scissor box の交差部分の内側でのみ描画できる。scissor test が有効でない場合、 プリミティブは viewport と現在バインドされている framebuffer の交差部分の内側でのみ 描画できる。

void scissor(GLint x, GLint y, GLsizei width, GLsizei height) OpenGL ES 2.0 §4.1.2man ページ
void viewport(GLint x, GLint y, GLsizei width, GLsizei height) OpenGL ES 2.0 §2.12.1man ページ

Buffer オブジェクト

Buffer オブジェクト(VBO と呼ばれることもある)は、GLSL shader のための頂点属性データを 保持する。

void bindBuffer(GLenum target, WebGLBuffer? buffer) OpenGL ES 2.0 §2.9man ページ
buffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

指定された WebGLBuffer オブジェクトを、指定されたバインディングポイント(target)、 ARRAY_BUFFER または ELEMENT_ARRAY_BUFFER のいずれかへバインドする。buffer が null の場合、 この target に現在バインドされている任意の buffer はアンバインドされる。 ある WebGLBuffer オブジェクトは、その生存期間中、ARRAY_BUFFER または ELEMENT_ARRAY_BUFFER target のいずれか一方にのみバインドできる。buffer オブジェクトを もう一方の target へバインドしようとすると、INVALID_OPERATION エラーが 生成され、現在のバインディングは変更されない。 削除対象としてマークされたオブジェクトをバインドしようとすると、 INVALID_OPERATION エラーが生成され、現在のバインディングは変更されない。
void bufferData(GLenum target, GLsizeiptr size, GLenum usage) OpenGL ES 2.0 §2.9man ページ
渡された target について、現在バインドされている WebGLBuffer オブジェクトのサイズを 設定する。buffer は 0 に初期化される。
void bufferData(GLenum target, AllowSharedBufferSource? data, GLenum usage) OpenGL ES 2.0 §2.9man ページ
渡された target について、現在バインドされている WebGLBuffer オブジェクトのサイズを 渡された data のサイズに設定し、その後 data の内容を buffer オブジェクトへ書き込む。

渡された data が null の場合、INVALID_VALUE エラーが生成される。

void bufferSubData(GLenum target, GLintptr offset, AllowSharedBufferSource data) OpenGL ES 2.0 §2.9man ページ

渡された target にバインドされた WebGLBuffer オブジェクトについて、渡された offset から 渡された data を書き込む。data が buffer オブジェクトの末尾を越えて書き込まれる場合、 INVALID_VALUE エラーが生成される。data が null の場合、 INVALID_VALUE エラーが生成される。
WebGLBuffer createBuffer() OpenGL ES 2.0 §2.9glGenBuffers と同様)
glGenBuffers を呼び出したかのように、WebGLBuffer オブジェクトを作成し、それを buffer オブジェクト名で初期化する。
void deleteBuffer(WebGLBuffer? buffer) OpenGL ES 2.0 §2.9glDeleteBuffers と同様)
buffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

glDeleteBuffers を呼び出したかのように、渡された WebGLBuffer に含まれる buffer オブジェクトを削除対象としてマークする。 オブジェクトがすでに削除対象としてマークされている場合、この呼び出しは効果を持たない。 基盤となる GL オブジェクトは JS オブジェクトが破棄されると自動的に削除対象として マークされるが、このメソッドは著者がオブジェクトを早期に削除対象としてマークすることを 可能にすることに注意。
any getBufferParameter(GLenum target, GLenum pname) OpenGL ES 2.0 §6.1.3glGetBufferParameteriv と同様)
渡された pname に対する値を返す。返される型は、次の表で示されるように、 要求された pname に対する自然な型である。
pname 返される型
BUFFER_SIZE GLint
BUFFER_USAGE GLenum

pname が上の表にない場合、INVALID_ENUM エラーを生成する。

OpenGL エラーが生成された場合、null を返す。

[WebGLHandlesContextLoss] GLboolean isBuffer(WebGLBuffer? buffer) OpenGL ES 2.0 §6.1.6man ページ
渡された WebGLBuffer が有効である場合は true を返し、そうでない場合は false を返す。

buffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、false を返す。

buffer の invalidated フラグが設定されている場合、false を返す。

Framebuffer オブジェクト

Framebuffer オブジェクトは、描画バッファに代わるレンダリングターゲットを提供する。 それらは color、alpha、depth および stencil buffer の集合であり、後でテクスチャとして 使用される画像をレンダリングするためによく使用される。

void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer) OpenGL ES 2.0 §4.4.1man ページ
framebuffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

指定された WebGLFramebuffer オブジェクトを、指定された バインディングポイント(target)へバインドする。 これは FRAMEBUFFER でなければならない。 framebuffer が null の場合、コンテキストによって提供される デフォルト framebuffer がバインドされ、target FRAMEBUFFER 上の状態を変更または問い合わせようとすると INVALID_OPERATION エラーが生成される。 削除対象としてマークされたオブジェクトをバインドしようとすると、 INVALID_OPERATION エラーが生成され、現在のバインディングは変更されない。
[WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target) OpenGL ES 2.0 §4.4.5man ページ
コンテキストの webgl コンテキスト喪失フラグが 設定されている場合、FRAMEBUFFER_UNSUPPORTED を返す。
WebGLFramebuffer createFramebuffer() OpenGL ES 2.0 §4.4.1glGenFramebuffers と同様)
glGenFramebuffers を呼び出したかのように、WebGLFramebuffer オブジェクトを作成し、 それを framebuffer オブジェクト名で初期化する。
void deleteFramebuffer(WebGLFramebuffer? buffer) OpenGL ES 2.0 §4.4.1glDeleteFramebuffers と同様)
framebuffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

glDeleteFramebuffers を呼び出したかのように、渡された WebGLFramebuffer に含まれる framebuffer オブジェクトを削除対象としてマークする。 オブジェクトがすでに削除対象としてマークされている場合、この呼び出しは効果を持たない。 基盤となる GL オブジェクトは JS オブジェクトが破棄されると自動的に削除対象として マークされるが、このメソッドは著者がオブジェクトを早期に削除対象としてマークすることを 可能にすることに注意。
void framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, WebGLRenderbuffer? renderbuffer) OpenGL ES 2.0 §4.4.3man ページ
renderbuffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

void framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, WebGLTexture? texture, GLint level) OpenGL ES 2.0 §4.4.3man ページ
texture がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname) OpenGL ES 2.0 §6.1.3glGetFramebufferAttachmentParameteriv と同様)
渡された target および attachment について、渡された pname に対する値を返す。 返される型は、次の表で示されるように、要求された pname に対する自然な型である。
pname 返される型
FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE GLenum
FRAMEBUFFER_ATTACHMENT_OBJECT_NAME WebGLRenderbuffer or WebGLTexture
FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL GLint
FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE GLint

pname が上の表にない場合、INVALID_ENUM エラーを生成する。

OpenGL エラーが生成された場合、null を返す。

[WebGLHandlesContextLoss] GLboolean isFramebuffer(WebGLFramebuffer? framebuffer) OpenGL ES 2.0 §6.1.7man ページ
渡された WebGLFramebuffer が有効である場合は true を返し、そうでない場合は false を返す。

framebuffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、false を返す。

framebuffer の invalidated フラグが設定されている場合、false を返す。

Renderbuffer オブジェクト

Renderbuffer オブジェクトは、framebuffer オブジェクト内で使用される個々の buffer のための ストレージを提供するために使用される。

void bindRenderbuffer(GLenum target, WebGLRenderbuffer? renderbuffer) OpenGL ES 2.0 §4.4.3man ページ
renderbuffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

指定された WebGLRenderbuffer オブジェクトを、指定された バインディングポイント(target)へバインドする。 これは RENDERBUFFER でなければならない。 renderbuffer が null の場合、この target に現在バインドされている renderbuffer オブジェクトは アンバインドされる。 削除対象としてマークされたオブジェクトをバインドしようとすると、 INVALID_OPERATION エラーが生成され、現在のバインディングは変更されない。
WebGLRenderbuffer createRenderbuffer() OpenGL ES 2.0 §4.4.3glGenRenderbuffers と同様)
glGenRenderbuffers を呼び出したかのように、WebGLRenderbuffer オブジェクトを作成し、 それを renderbuffer オブジェクト名で初期化する。
void deleteRenderbuffer(WebGLRenderbuffer? renderbuffer) OpenGL ES 2.0 §4.4.3glDeleteRenderbuffers と同様)
renderbuffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

glDeleteRenderbuffers を呼び出したかのように、渡された WebGLRenderbuffer に含まれる renderbuffer オブジェクトを削除対象としてマークする。 オブジェクトがすでに削除対象としてマークされている場合、この呼び出しは効果を持たない。 基盤となる GL オブジェクトは JS オブジェクトが破棄されると自動的に削除対象として マークされるが、このメソッドは著者がオブジェクトを早期に削除対象としてマークすることを 可能にすることに注意。
any getRenderbufferParameter(GLenum target, GLenum pname) OpenGL ES 2.0 §6.1.3glGetRenderbufferParameteriv と同様)
渡された target について、渡された pname に対する値を返す。返される型は、 次の表で示されるように、要求された pname に対する自然な型である。
pname 返される型
RENDERBUFFER_WIDTH GLint
RENDERBUFFER_HEIGHT GLint
RENDERBUFFER_INTERNAL_FORMAT GLenum
RENDERBUFFER_RED_SIZE GLint
RENDERBUFFER_GREEN_SIZE GLint
RENDERBUFFER_BLUE_SIZE GLint
RENDERBUFFER_ALPHA_SIZE GLint
RENDERBUFFER_DEPTH_SIZE GLint
RENDERBUFFER_STENCIL_SIZE GLint

pname が上の表にない場合、INVALID_ENUM エラーを生成する。

OpenGL エラーが生成された場合、null を返す。

[WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer) OpenGL ES 2.0 §6.1.7man ページ
渡された WebGLRenderbuffer が有効である場合は true を返し、そうでない場合は false を返す。

renderbuffer がこのものとは異なる WebGLRenderingContext によって 生成された場合、false を返す。

renderbuffer の invalidated フラグが設定されている場合、false を返す。
void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) OpenGL ES 2.0 §4.4.3man ページ

Texture オブジェクト

Texture オブジェクトは、テクスチャリング操作のためのストレージおよび状態を提供する。 WebGLTexture がバインドされていない場合(たとえば bindTexture に null または 0 を渡す場合)、 texture オブジェクトを変更または問い合わせようとすると INVALID_OPERATION エラーが 生成されなければならない。これは以下の関数で示される。

void bindTexture(GLenum target, WebGLTexture? texture) OpenGL ES 2.0 §3.7.13man ページ
texture がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

削除対象としてマークされたオブジェクトをバインドしようとすると、 INVALID_OPERATION エラーが生成され、現在のバインディングは変更されない。

void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, [AllowShared] ArrayBufferView pixels) OpenGL ES 2.0 §3.7.3man ページ

void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, [AllowShared] ArrayBufferView pixels) OpenGL ES 2.0 §3.7.3man ページ

WebGLTexture がバインドされていない状態(上記参照)でこれらの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。

中核 WebGL 仕様は、サポートされる圧縮テクスチャ形式を定義しない。 デフォルトでは、これらのメソッドは INVALID_ENUM エラーを生成し、ただちに 戻る。圧縮テクスチャサポートを参照。
void copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) OpenGL ES 2.0 §3.7.2man ページ
[読み取り操作]
WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。

この関数は、texImage2D が null データで呼び出され、その後 copyTexSubImage2D が呼び出されたかのように振る舞う。 copyTexSubImage2D と同様に、framebuffer の外側にある任意のソースピクセルに ついて、対応する宛先 texel は変更されないまま残るため、texImage2D が null データで呼び出されたかのように、それらはゼロ初期化された内容を保持する。 これにより、framebuffer の外側にあるソースピクセルについて、対応する宛先ピクセルでは、 関連する texel のすべてのチャンネルが 0 に初期化されるという複合的な効果がある。 framebuffer の外側のピクセルの読み取りを参照。

この関数が、欠落した attachment を持つ complete framebuffer から読み取ろうとする場合、 欠落した attachment からの読み取りに従って、 INVALID_OPERATION エラーが生成される。
void copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) OpenGL ES 2.0 §3.7.2man ページ
[読み取り操作]
WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。

frame buffer の外側にある任意のピクセルについて、対応する宛先ピクセルは変更されないまま残る。 framebuffer の外側のピクセルの読み取りを参照。

この関数が、欠落した attachment を持つ complete framebuffer から読み取ろうとする場合、 欠落した attachment からの読み取りに従って、 INVALID_OPERATION エラーが生成される。
WebGLTexture createTexture() OpenGL ES 2.0 §3.7.13man ページ
glGenTextures を呼び出したかのように、WebGLTexture オブジェクトを作成し、それを texture オブジェクト名で初期化する。
void deleteTexture(WebGLTexture? texture) OpenGL ES 2.0 §3.7.13man ページ
texture がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

glDeleteTextures を呼び出したかのように、渡された WebGLTexture に含まれる texture オブジェクトを削除対象としてマークする。 オブジェクトがすでに削除対象としてマークされている場合、この呼び出しは効果を持たない。 基盤となる GL オブジェクトは JS オブジェクトが破棄されると自動的に削除対象として マークされるが、このメソッドは著者がオブジェクトを早期に削除対象としてマークすることを 可能にすることに注意。
void generateMipmap(GLenum target) OpenGL ES 2.0 §3.7.11man ページ
WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。
any getTexParameter(GLenum target, GLenum pname) OpenGL ES 2.0 §6.1.3man ページ
渡された target について、渡された pname に対する値を返す。返される型は、 次の表で示されるように、要求された pname に対する自然な型である。
pname 返される型
TEXTURE_MAG_FILTER GLenum
TEXTURE_MIN_FILTER GLenum
TEXTURE_WRAP_S GLenum
TEXTURE_WRAP_T GLenum

pname が上の表にない場合、INVALID_ENUM エラーを生成する。

WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーを生成する。

OpenGL エラーが生成された場合、null を返す。

[WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture) OpenGL ES 2.0 §6.1.4man ページ
渡された WebGLTexture が有効である場合は true を返し、そうでない場合は false を返す。

texture がこのものとは異なる WebGLRenderingContext によって 生成された場合、false を返す。

texture の invalidated フラグが設定されている場合、false を返す。
void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels) OpenGL ES 2.0 §3.7.1man ページ
pixels が null の場合、0 に初期化された十分なサイズの buffer が渡される。

pixels が非 null の場合、pixels の型は読み取られるデータの型に 一致しなければならない。それが UNSIGNED_BYTE の場合、Uint8Array または Uint8ClampedArray が供給されなければならない。それが UNSIGNED_SHORT_5_6_5、 UNSIGNED_SHORT_4_4_4_4、または UNSIGNED_SHORT_5_5_5_1 の場合、Uint16Array が 供給されなければならない。型が一致しない場合、INVALID_OPERATION エラーが生成される。

WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。

この関数の振る舞いに影響する WebGL 固有のピクセルストレージパラメーターについては、 ピクセルストレージパラメーターを参照。

pixels が非 null であるが、そのサイズが、指定された widthheightformattype、および ピクセルストレージパラメーターによって要求されるものより小さい場合、 INVALID_OPERATION エラーを生成する。

void texImage2D(GLenum target, GLint level, GLint internalformat, GLenum format, GLenum type, TexImageSource source) /* May throw DOMException */ OpenGL ES 2.0 §3.7.1man ページ

指定された要素または画像データを、現在バインドされている WebGLTexture へアップロードする。

テクスチャの width および height は、 テクスチャアップロードの幅と高さの節で指定されるように 設定される。

まず、ソース画像データは、UNPACK_COLORSPACE_CONVERSION_WEBGL ピクセルストレージパラメーターが NONE に設定されている場合を除き、 unpackColorSpace 属性によって指定される色空間へ概念的に変換される。

この色空間変換は ImageBitmap オブジェクトにも適用されるが、 他のテクスチャ unpack パラメーターは ImageBitmap には適用されない。 それらは ImageBitmap の構築時に指定されることが期待されるためである。 実装経験により、WebGL テクスチャへアップロードする際に ImageBitmap の色空間変換を可能な限り遅く行うことが有益であることが 明らかになった。
次に、ソース画像データは、format および type 引数によって 指定されたデータ型および形式へ変換され、その後 WebGL 実装へ転送される。 形式変換は次の表に従って実行される。画像データから精度のビットが失われることを 意味する packed pixel format が指定された場合、この精度の損失は発生しなければならない。

ソース DOM 画像形式 ターゲット WebGL 形式
ALPHA RGB RGBA LUMINANCE LUMINANCE_ALPHA
グレースケール(1 チャンネル) A = 255 (1.0) R = sourceGray
G = sourceGray
B = sourceGray
R = sourceGray
G = sourceGray
B = sourceGray
A = 255 (1.0)
L = sourceGray L = sourceGray
A = 255 (1.0)
グレースケール + Alpha(2 チャンネル) A = sourceAlpha R = sourceGray
G = sourceGray
B = sourceGray
R = sourceGray
G = sourceGray
B = sourceGray
A = sourceAlpha
L = sourceGray
L = sourceGray
A = sourceAlpha
カラー(3 チャンネル) A = 255 (1.0) R = sourceRed
G = sourceGreen
B = sourceBlue
R = sourceRed
G = sourceGreen
B = sourceBlue
A = 255 (1.0)
L = sourceRed L = sourceRed
A = 255 (1.0)
カラー + Alpha(4 チャンネル) A = sourceAlpha R = sourceRed
G = sourceGreen
B = sourceBlue
R = sourceRed
G = sourceGreen
B = sourceBlue
A = sourceAlpha
L = sourceRed L = sourceRed
A = sourceAlpha

ImageBitmap 以外の任意の引数型で呼び出される場合に、この関数の振る舞いに 影響する WebGL 固有のピクセルストレージパラメーターについては、 ピクセルストレージパラメーターを参照。

ソースから WebGL 実装へ転送される最初のピクセルは、ソースの左上隅に対応する。 この振る舞いは、前述の節で記述されるように、ImageBitmap 引数を除き、 UNPACK_FLIP_Y_WEBGL ピクセルストレージ パラメーターによって変更される。

ソースが HTMLImageElement または ImageBitmap であり、 8 ビット/チャンネルの RGB または RGBA ロスレス画像を含む場合、ブラウザーはすべての チャンネルの完全な精度が保持されることを保証する。

元の HTMLImageElement がアルファチャンネルを含み、 UNPACK_PREMULTIPLY_ALPHA_WEBGL ピクセルストレージパラメーターが false の場合、 RGB 値は、元のファイル形式から直接導出されたか、または他の色形式から変換されたかに かかわらず、アルファチャンネルによってプリマルチプライされていないことが保証される。

HTMLCanvasElement または OffscreenCanvas の CanvasRenderingContext2D の一部の実装は、 色値を内部的にプリマルチプライド形式で格納する。そのような canvas が UNPACK_PREMULTIPLY_ALPHA_WEBGL ピクセルストレージパラメーターを false に 設定して WebGL テクスチャへアップロードされる場合、色チャンネルはアルファチャンネルに よって非乗算化されなければならず、これは損失を伴う操作である。したがって、 WebGL 実装は、alpha < 1.0 の色が、最初に CanvasRenderingContext2D を介して canvas へ描画され、その後 UNPACK_PREMULTIPLY_ALPHA_WEBGL ピクセルストレージパラメーターを false に設定して WebGL テクスチャへアップロードされる とき、損失なく保持されることを保証できない。
WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。

この関数が data 属性を neuter された ImageData で呼び出される場合、 INVALID_VALUE エラーが生成される。

この関数が neuter された ImageBitmap で呼び出される場合、 INVALID_VALUE エラーが生成される。

この関数が、包含する Document のオリジンと異なるオリジンを持つ HTMLImageElement または HTMLVideoElement で呼び出される場合、 またはビットマップの origin-clean フラグが false に設定された HTMLCanvasElementImageBitmap、または OffscreenCanvas で呼び出される場合、SECURITY_ERR 例外が 投げられなければならない。オリジン制限を参照。

source が null の場合、INVALID_VALUE エラーが生成される。

void texParameterf(GLenum target, GLenum pname, GLfloat param) OpenGL ES 2.0 §3.7.4man ページ
WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。
void texParameteri(GLenum target, GLenum pname, GLint param) OpenGL ES 2.0 §3.7.4man ページ
WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。
void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels) OpenGL ES 2.0 §3.7.2man ページ
format および pixels 引数に対する制限については、 texImage2Dを参照。

WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。

type がテクスチャを定義するために最初に使用された型と一致しない場合、 INVALID_OPERATION エラーが生成される。

pixels が null の場合、INVALID_VALUE エラーが生成される。

pixels が非 null であるが、そのサイズが、指定された widthheightformattype、および ピクセルストレージパラメーターによって要求されるものより小さい場合、 INVALID_OPERATION エラーを生成する。

この関数の振る舞いに影響する WebGL 固有のピクセルストレージパラメーターについては、 ピクセルストレージパラメーターを参照。

void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLenum format, GLenum type, TexImageSource source) /* May throw DOMException */ OpenGL ES 2.0 §3.7.2man ページ

現在バインドされている WebGLTexture の部分矩形を、指定された要素または画像データの内容で 更新する。

更新される部分矩形の width および height は、 テクスチャアップロードの幅と高さの節で指定されるように 決定される。

format および type 引数の解釈、WebGL 固有のピクセルストレージ パラメーターの取り扱い、および入力の潜在的な色空間変換については、 texImage2Dを参照。

ソースから WebGL 実装へ転送される最初のピクセルは、ソースの左上隅に対応する。 この振る舞いは、前述の節で記述されるように、ImageBitmap 引数を除き、 UNPACK_FLIP_Y_WEBGL ピクセルストレージ パラメーターによって変更される。

WebGLTexture がバインドされていない状態(上記参照)でこの関数を呼び出そうとした場合、 INVALID_OPERATION エラーが生成される。

type がテクスチャを定義するために最初に使用された型と一致しない場合、 INVALID_OPERATION エラーが生成される。

この関数が data 属性を neuter された ImageData で呼び出される場合、 INVALID_VALUE エラーが生成される。

この関数が neuter された ImageBitmap で呼び出される場合、 INVALID_VALUE エラーが生成される。

この関数が、包含する Document のオリジンと異なるオリジンを持つ HTMLImageElement または HTMLVideoElement で呼び出される場合、 またはビットマップの origin-clean フラグが false に設定された HTMLCanvasElementImageBitmap、 または OffscreenCanvas で呼び出される場合、 SECURITY_ERR 例外が投げられなければならない。 オリジン制限を参照。

source が null の場合、INVALID_VALUE エラーが生成される。

Programs と Shaders

OpenGL ES 2.0 によるレンダリングには、OpenGL ES のシェーディング言語である GLSL ES で 書かれたshadersの使用が必要である。 Shaders はソース文字列で読み込まれ(shaderSource)、コンパイルされ (compileShader)、program にアタッチされ(attachShader)、それがリンクされ (linkProgram)、その後使用されなければならない(useProgram)。

void attachShader(WebGLProgram program, WebGLShader shader) OpenGL ES 2.0 §2.10.3man ページ
program または shader のいずれかが、このものとは異なる WebGLRenderingContext によって生成された場合、 INVALID_OPERATION エラーを生成する。
void bindAttribLocation(WebGLProgram program, GLuint index, DOMString name) OpenGL ES 2.0 §2.10.4man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

渡された name が Uniform および Attribute Location の最大長で定義される 制限より長い場合、INVALID_VALUE エラーを生成する。

nameGLSL Constructs に従う 予約済み WebGL 接頭辞のいずれかで始まる場合、 INVALID_OPERATION エラーを生成する。

WebGL 実装によって実行される追加の検証については、 GLSL ソース文字集合の外側の文字を参照。
void compileShader(WebGLShader shader) OpenGL ES 2.0 §2.10.1man ページ
shader がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

WebGL 実装で強制される追加の制約、サポートされる追加の構文、および実行される追加の検証に ついては、サポートされる GLSL ConstructsGLSL トークンの最大 サイズGLSL ソース 文字集合の外側の文字GLSL Shaders における構造体の最大ネスト、および Uniforms および Varyings のパッキング制限を参照。
WebGLProgram createProgram() OpenGL ES 2.0 §2.10.3man ページ
glCreateProgram を呼び出したかのように、WebGLProgram オブジェクトを作成し、 program オブジェクト名で初期化する。
WebGLShader? createShader(GLenum type) OpenGL ES 2.0 §2.10.1man ページ
glCreateShader を呼び出したかのように、WebGLShader オブジェクトを作成し、 shader オブジェクト名で初期化する。
void deleteProgram(WebGLProgram? program) OpenGL ES 2.0 §2.10.3man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

glDeleteProgram を呼び出したかのように、渡された WebGLProgram に含まれる program オブジェクトを削除対象としてマークする。 オブジェクトがすでに削除対象としてマークされている場合、この呼び出しは効果を持たない。 基盤となる GL オブジェクトは JS オブジェクトが破棄されると自動的に削除対象として マークされるが、このメソッドは著者がオブジェクトを早期に削除対象としてマークすることを 可能にすることに注意。
void deleteShader(WebGLShader? shader) OpenGL ES 2.0 §2.10.1man ページ
shader がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

glDeleteShader を呼び出したかのように、渡された WebGLShader に含まれる shader オブジェクトを削除対象としてマークする。 オブジェクトがすでに削除対象としてマークされている場合、この呼び出しは効果を持たない。 基盤となる GL オブジェクトは JS オブジェクトが破棄されると自動的に削除対象として マークされるが、このメソッドは著者がオブジェクトを早期に削除対象としてマークすることを 可能にすることに注意。
void detachShader(WebGLProgram program, WebGLShader shader) OpenGL ES 2.0 §2.10.3man ページ
program または shader のいずれかが、このものとは異なる WebGLRenderingContext によって生成された場合、 INVALID_OPERATION エラーを生成する。
sequence<WebGLShader>? getAttachedShaders(WebGLProgram program) OpenGL ES 2.0 §6.1.8man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

渡された program にアタッチされている shaders のリストを表す新しいオブジェクトを返す。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

any getProgramParameter(WebGLProgram program, GLenum pname) OpenGL ES 2.0 §6.1.8man ページ と同様)
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

渡された program について、渡された pname に対する値を返す。返される型は、 次の表で示されるように、要求された pname に対する自然な型である。
pname 返される型
DELETE_STATUS GLboolean
LINK_STATUS GLboolean
VALIDATE_STATUS GLboolean
ATTACHED_SHADERS GLint
ACTIVE_ATTRIBUTES GLint
ACTIVE_UNIFORMS GLint

pname が上の表にない場合、INVALID_ENUM エラーを生成し、 null を返す。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

DOMString? getProgramInfoLog(WebGLProgram program) OpenGL ES 2.0 §6.1.8man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

any getShaderParameter(WebGLShader shader, GLenum pname) OpenGL ES 2.0 §6.1.8man ページ と同様)
shader がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

渡された shader について、渡された pname に対する値を返す。返される型は、 次の表で示されるように、要求された pname に対する自然な型である。
pname 返される型
SHADER_TYPE GLenum
DELETE_STATUS GLboolean
COMPILE_STATUS GLboolean

pname が上の表にない場合、INVALID_ENUM エラーを生成し、 null を返す。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

WebGLShaderPrecisionFormat? getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype) OpenGL ES 2.0 §6.1.8man ページ と同様)

指定された shader 数値形式の範囲および精度を記述する新しい WebGLShaderPrecisionFormat を返す。shadertype 値は FRAGMENT_SHADER または VERTEX_SHADER であり得る。precisiontype 値は LOW_FLOAT、MEDIUM_FLOAT、HIGH_FLOAT、 LOW_INT、MEDIUM_INT または HIGH_INT であり得る。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

DOMString? getShaderInfoLog(WebGLShader shader) OpenGL ES 2.0 §6.1.8man ページ
shader がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

DOMString? getShaderSource(WebGLShader shader) OpenGL ES 2.0 §6.1.8man ページ
shader がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

[WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program) OpenGL ES 2.0 §6.1.8man ページ
渡された WebGLProgram が有効である場合は true を返し、そうでない場合は false を返す。

program がこのものとは異なる WebGLRenderingContext によって 生成された場合、false を返す。

program の invalidated フラグが設定されている場合、false を返す。
[WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader) OpenGL ES 2.0 §6.1.8man ページ
渡された WebGLShader が有効である場合は true を返し、そうでない場合は false を返す。

shader がこのものとは異なる WebGLRenderingContext によって 生成された場合、false を返す。

shader の invalidated フラグが設定されている場合、false を返す。
void linkProgram(WebGLProgram program) OpenGL ES 2.0 §2.10.3man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

渡された program オブジェクトをリンクする。振る舞いの詳細は OpenGL ES 2.0 仕様で 定義されるが、次の明確化を伴う。linkProgram は、このグループ内で、渡された program の link status およびそれが参照する内部実行可能コードに影響する唯一の API である。 shader オブジェクトを program にアタッチまたはデタッチする、program にアタッチされた shader オブジェクトを変更する、または program にアタッチされた shader オブジェクトを コンパイルするなどの操作は、その program の link status にも、その program が参照し得る 実行可能コードにも影響しない。

指定された program が、下で定義される useProgram によって使用中の 現在の program オブジェクトでもある場合、次のとおりである。 WebGL 実装で強制される追加の制約、および実行される追加の検証については、 Uniforms および Varyings のパッキング制限を参照。
void shaderSource(WebGLShader shader, DOMString source) OpenGL ES 2.0 §2.10.1man ページ
shader がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

WebGL 実装で強制される追加の制約、サポートされる追加の構文、および実行される追加の検証に ついては、サポートされる GLSL ConstructsGLSL トークンの最大 サイズGLSL ソース 文字集合の外側の文字GLSL Shaders における構造体の最大ネスト、および Uniforms および Varyings のパッキング制限を参照。
void useProgram(WebGLProgram? program) OpenGL ES 2.0 §2.10.3man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

void validateProgram(WebGLProgram program) OpenGL ES 2.0 §2.10.5man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

Uniforms と attributes

shaders によって使用される値は、uniforms または vertex attributes として渡される。

void disableVertexAttribArray(GLuint index) OpenGL ES 2.0 §2.8man ページ
void enableVertexAttribArray(GLuint index) OpenGL ES 2.0 §2.8man ページ
index の vertex attribute を array として有効化する。WebGL は、有効化された vertex attributes に関して OpenGL ES 2.0 を超える追加の規則を課す。 有効化された Vertex Attributes と範囲 チェックを参照。
WebGLActiveInfo? getActiveAttrib(WebGLProgram program, GLuint index) OpenGL ES 2.0 §2.10.4man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

渡された program オブジェクトの、渡された index にある vertex attribute のサイズ、型、 および名前を記述する新しい WebGLActiveInfo オブジェクトを返す。 渡された index が範囲外の場合、INVALID_VALUE エラーを生成し、null を返す。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

WebGLActiveInfo? getActiveUniform(WebGLProgram program, GLuint index) OpenGL ES 2.0 §2.10.4man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成する。

渡された program オブジェクトの、渡された index にある uniform のサイズ、型、および名前を 記述する新しい WebGLActiveInfo オブジェクトを返す。渡された index が 範囲外の場合、INVALID_VALUE エラーを生成し、null を返す。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

[WebGLHandlesContextLoss] GLint getAttribLocation(WebGLProgram program, DOMString name) OpenGL ES 2.0 §2.10.4man ページ
コンテキストの webgl コンテキスト喪失フラグが 設定されている場合、渡されたパラメーターにかかわらず、エラーを生成せず -1 を返す。

渡された programinvalidated flag が設定されている場合、 INVALID_OPERATION エラーを生成し、-1 を返す。

program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成し、-1 を返す。

program が削除されている場合、 INVALID_VALUE エラーを生成し、-1 を返す。

program がリンクされていない場合、 INVALID_OPERATION エラーを生成し、-1 を返す。

渡された nameUniform および Attribute Location の最大長で定義される 制限より長い場合、INVALID_VALUE エラーを生成し、-1 を返す。

渡された nameGLSL ソース文字集合の外側の文字を含む場合、 INVALID_VALUE エラーを生成し、-1 を返す。

渡された nameGLSL Constructs に従う 予約済み WebGL 接頭辞のいずれかで始まり、かつ上で記述されたエラー条件のいずれも 適用されない場合、エラーを生成せず -1 を返す。
any getUniform(WebGLProgram program, WebGLUniformLocation location) OpenGL ES 2.0 §6.1.8man ページ
program または location のいずれかが、このものとは異なる WebGLRenderingContext によって生成された場合、 INVALID_OPERATION エラーを生成する。

渡された program 内の、渡された location にある uniform 値を返す。返される型は、 次の表に示されるように、uniform 型に依存する。
uniform 型 返される型
boolean GLboolean
int GLint
float GLfloat
vec2 Float32Array(2 要素)
ivec2 Int32Array(2 要素)
bvec2 sequence<GLboolean>(2 要素)
vec3 Float32Array(3 要素)
ivec3 Int32Array(3 要素)
bvec3 sequence<GLboolean>(3 要素)
vec4 Float32Array(4 要素)
ivec4 Int32Array(4 要素)
bvec4 sequence<GLboolean>(4 要素)
mat2 Float32Array(4 要素)
mat3 Float32Array(9 要素)
mat4 Float32Array(16 要素)
sampler2D GLint
samplerCube GLint

シーケンスまたは typed arrays を返すすべての問い合わせは、毎回新しいオブジェクトを返す。

この関数の実行中に OpenGL エラーが生成された場合、null を返す。

WebGLUniformLocation? getUniformLocation(WebGLProgram program, DOMString name) OpenGL ES 2.0 §2.10.4man ページ
program がこのものとは異なる WebGLRenderingContext によって 生成された場合、INVALID_OPERATION エラーを生成し、null を返す。

program が削除されている場合、 INVALID_VALUE エラーを生成し、null を返す。

program がリンクされていない場合、 INVALID_OPERATION エラーを生成し、null を返す。

渡された nameUniform および Attribute Location の最大長で定義される 制限より長い場合、INVALID_VALUE エラーを生成し、null を返す。

渡された nameGLSL ソース文字集合の外側の文字を含む場合、 INVALID_VALUE エラーを生成し、null を返す。

渡された nameGLSL Constructs に従う 予約済み WebGL 接頭辞のいずれかで始まり、かつ上で記述されたエラー条件のいずれも 適用されない場合、エラーを生成せず null を返す。

program オブジェクト内の特定の uniform 変数の位置を表す新しい WebGLUniformLocation を返す。name が渡された program 内の active uniform 変数に対応しない場合、戻り値は null である。
any getVertexAttrib(GLuint index, GLenum pname) OpenGL ES 2.0 §6.1.8man ページ
渡された index にある vertex attribute について、pname で要求された情報を返す。 返される型は、次の表に示されるように、要求された情報に依存する。
pname 返される型
VERTEX_ATTRIB_ARRAY_BUFFER_BINDING WebGLBuffer
VERTEX_ATTRIB_ARRAY_ENABLED GLboolean
VERTEX_ATTRIB_ARRAY_SIZE GLint
VERTEX_ATTRIB_ARRAY_STRIDE GLint
VERTEX_ATTRIB_ARRAY_TYPE GLenum
VERTEX_ATTRIB_ARRAY_NORMALIZED GLboolean
CURRENT_VERTEX_ATTRIB Float32Array(4 要素)

シーケンスまたは typed arrays を返すすべての問い合わせは、毎回新しいオブジェクトを返す。

pname が上の表にない場合、INVALID_ENUM エラーを生成する。

OpenGL エラーが生成された場合、null を返す。

[WebGLHandlesContextLoss] GLsizeiptr getVertexAttribOffset(GLuint index, GLenum pname) OpenGL ES 2.0 §6.1.8man ページ と同様)
コンテキストの webgl コンテキスト喪失 フラグが設定されている場合、0 を返す。

void uniform[1234][fi](WebGLUniformLocation? location, ...)

void uniform[1234][fi]v(WebGLUniformLocation? location, ...)

void uniformMatrix[234]fv(WebGLUniformLocation? location, GLboolean transpose, ...) OpenGL ES 2.0 §2.10.4man ページ

上記の各 uniform* 関数は、指定された uniform または uniforms を、提供された値に設定する。 渡された location が null でなく、かつ現在使用中の program から以前の getUniformLocation 呼び出しによって取得されたものでない場合、 INVALID_OPERATION エラーが生成される。渡された location が null の場合、渡されたデータは黙って無視され、uniform 変数は 変更されない。

vector 形式(v で終わるもの)のいずれかに渡された array の長さが無効な場合、 INVALID_VALUE エラーが生成される。その長さが、割り当てられた型に対して 短すぎる場合、またはその型の整数倍でない場合、その長さは無効である。
一部の実装では、uniform1i を用いて sampler uniforms を 更新する際に性能上の問題が観察されている。sampler uniform が参照するテクスチャを 変更するには、uniform1i を用いて uniform 自体を更新するよりも、 uniform が参照する texture unit に新しい texture をバインドすることが望ましい。

void vertexAttrib[1234]f(GLuint index, ...)

void vertexAttrib[1234]fv(GLuint index, ...) OpenGL ES 2.0 §2.7man ページ

渡された index にある vertex attribute を、指定された定数値に設定する。 vertexAttrib によって設定された値は、途中に drawArrays または drawElements の呼び出しがあった場合でも、CURRENT_VERTEX_ATTRIB param を指定した getVertexAttrib 関数から返されることが保証される。

vector 形式(v で終わるもの)のいずれかに渡された array が短すぎる場合、 INVALID_VALUE エラーが生成される。
void vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset) OpenGL ES 2.0 §2.8man ページ
ARRAY_BUFFER target に現在バインドされている WebGLBuffer オブジェクトを、渡された index にある vertex attribute に割り当てる。Size は attribute あたりのコンポーネント数である。 Stride および offset はバイト単位である。渡された stride および offset は、渡された type および size に対して適切でなければならず、そうでない場合 INVALID_OPERATION エラーが生成される。 Buffer Offset および Stride の要件を参照。 offset が負の場合、INVALID_VALUE エラーが生成される。ARRAY_BUFFER target に WebGLBuffer がバインドされておらず、offset が非ゼロの場合、 INVALID_OPERATION エラーが生成される。WebGL では、サポートされる最大 stride は 255 である。 Vertex Attribute Data Strideを参照。

描画操作

OpenGL ES 2.0 には、現在バインドされている(draw)framebuffer へ書き込むことが 許可される複数の呼び出しがある。 WebGL はそのようなすべての呼び出しを [描画操作]として分類する。

さらに、レンダリングは描画バッファまたは Framebuffer オブジェクトへ向けることができる。 レンダリングが描画バッファへ向けられている場合、任意のレンダリング呼び出しを行うと、 次の合成処理の開始時に描画バッファが HTML ページコンポジターへ提示されなければならない。

これらには次が含まれるが、(拡張または WebGL 2.0 における追加により)これらに限定されない。

たとえば、 ANGLE_instanced_arraysdrawArraysInstancedANGLE を追加し、 WebGL 2.0drawArraysInstanced を追加する。

これらの呼び出しのいずれかが、complete framebuffer の欠落した attachment へ描画しようとした場合、 欠落した Attachment への描画に従い、 その attachment には何も描画されず、エラーも生成されない。

void clear(GLbitfield mask) OpenGL ES 2.0 §4.2.3man ページ
[描画操作]
void drawArrays(GLenum mode, GLint first, GLsizei count) OpenGL ES 2.0 §2.8man ページ
[描画操作]
first が負の場合、INVALID_VALUE エラーが生成される。 CURRENT_PROGRAM が null の場合、INVALID_OPERATION エラーが生成される。
void drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset) OpenGL ES 2.0 §2.8man ページ
[描画操作]
現在バインドされている element array buffer を用いて描画する。指定された offset はバイト単位であり、 指定された type のサイズの有効な倍数でなければならず、そうでない場合 INVALID_OPERATION エラーが生成される。加えて、offset は非負でなければならず、 そうでない場合 INVALID_VALUE エラーが生成される。 Buffer Offset および Stride の要件を参照。count が 0 より大きい場合、 非 null の WebGLBufferELEMENT_ARRAY_BUFFER バインディングポイントに バインドされていなければならず、そうでない場合 INVALID_OPERATION エラーが 生成される。

CURRENT_PROGRAM が null の場合、INVALID_OPERATION エラーが生成される。
WebGL は、drawArrays および drawElements の呼び出し中に、 OpenGL ES 2.0 で指定されるものを超える追加のエラーチェックを実行する。 有効化された Vertex Attributes と範囲チェックを参照。
void finish() OpenGL ES 2.0 §5.1man ページ
void flush() OpenGL ES 2.0 §5.1man ページ

読み取り操作

OpenGL ES 2.0 には、現在バインドされている(read)framebuffer から読み取ることが 許可される複数の呼び出しがある。 WebGL はそのようなすべての呼び出しを [読み取り操作]として分類する。

これらには次が含まれるが、(拡張または WebGL 2.0 における追加により)これらに限定されない。

void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels) OpenGL ES 2.0 §4.3.1man ページ
[読み取り操作]
現在の framebuffer 内のピクセルは、ArrayBufferView オブジェクトへ読み戻される。
指定された frame buffer の矩形内のピクセルデータで pixels を満たす。 readPixels から返されるデータは、最も最近送信された描画コマンド時点で最新でなければならない。

pixels の型は、読み取られるデータの型に一致しなければならない。たとえば、 それが UNSIGNED_BYTE の場合、Uint8Array または Uint8ClampedArray が供給されなければならない。 それが UNSIGNED_SHORT_5_6_5、UNSIGNED_SHORT_4_4_4_4、または UNSIGNED_SHORT_5_5_5_1 の場合、 Uint16Array が供給されなければならない。それが FLOAT の場合、Float32Array が供給されなければ ならない。型が一致しない場合、INVALID_OPERATION エラーが生成される。

formattype の組み合わせは 2 つのみ受け入れられる。 1 つ目は format RGBA および type UNSIGNED_BYTE である。 2 つ目は実装が選択する形式である。この形式の format および type の値は、 記号定数 IMPLEMENTATION_COLOR_READ_FORMAT および IMPLEMENTATION_COLOR_READ_TYPE をそれぞれ用いて getParameter を呼び出すことによって決定できる。 実装が選択する形式は、現在バインドされているレンダリングサーフェスの形式に応じて変わる場合がある。 formattype のサポートされない組み合わせは、 INVALID_OPERATION エラーを生成する。

IMPLEMENTATION_COLOR_READ_[FORMAT,TYPE] の問い合わせは、他で使用されない enums を返す場合があるため、 これらの enums を readPixels に与えても、必ずしも INVALID_ENUM が生成されるとは 限らない。

pixels が null の場合、INVALID_VALUE エラーが生成される。 pixels が非 null であっても、pixel store modes を考慮して指定された矩形内の すべてのピクセルを取得するのに十分な大きさでない場合、INVALID_OPERATION エラーが生成される。

frame buffer の外側にある任意のピクセルについて、対応する宛先 buffer 範囲は変更されないまま残る。 Framebuffer の外側のピクセルの読み取りを参照。

この関数が、欠落した color attachment を持つ complete framebuffer から読み取ろうとする場合、 欠落した Attachment からの読み取りに従い、 INVALID_OPERATION エラーが生成される。

コンテキスト喪失イベントの検出

モバイルデバイス上の電源イベントなどの発生により、WebGL レンダリングコンテキストは いつでも喪失し、アプリケーションにそれを再構築することを要求する可能性がある。 詳細については WebGLContextEvent を参照。 次のメソッドはコンテキスト喪失イベントの検出を支援する。

[WebGLHandlesContextLoss] boolean isContextLost()
webgl コンテキスト喪失フラグが設定されている場合は true を返し、そうでなければ false を返す。

拡張の検出と有効化

WebGL の実装は、拡張機構を通じてその機能を最初に有効化することなく、 追加のパラメーター、定数、または関数をサポートしてはならない。 getSupportedExtensions 関数は、この実装がサポートする拡張文字列の配列を返す。 拡張は、それらの文字列の 1 つを getExtension 関数へ渡すことで有効化される。 この呼び出しは、その拡張によって定義される任意の定数または関数を含むオブジェクトを返す。 そのオブジェクトの定義は拡張固有であり、拡張仕様によって定義されなければならない。

拡張が有効化されると、それは WebGL レンダリングコンテキストが喪失した場合にのみ無効化される (下を参照)。ただし、"WEBGL_lose_context" 拡張は例外で、任意のコンテキスト喪失を通じて アクティブなままである。getExtension によって返されるオブジェクトなど、 無効化された拡張によって参照される任意のオブジェクトは、もはや WebGL レンダリングコンテキストに 関連付けられていない。WebGLObject から派生する任意の拡張オブジェクトは、その invalidated フラグが true に設定される。 コンテキスト喪失後の拡張のメソッドの振る舞いは、 "WebGL コンテキスト"の節の手順によって定義される。

拡張を無効化する他の機構はない。

同じ拡張文字列での getExtension の複数回の呼び出しは、大文字小文字を区別しない 比較を考慮したうえで、拡張が有効である限り同じオブジェクトを返さなければならない。 getExtension を最初に呼び出して有効化することなく拡張の任意の機能を使用しようとする試みは、 適切な GL エラーを生成しなければならず、その機能を使用してはならない。

この仕様は拡張を定義しない。別個の WebGL 拡張レジストリが、特定の WebGL 実装によって サポートされ得る拡張を定義する。

sequence<DOMString>? getSupportedExtensions()
サポートされているすべての拡張文字列のリストを返す。
object? getExtension(DOMString name)
namegetSupportedExtensions から返された名前の 1 つに対して ASCII 大文字小文字不区別一致 [HTML] である場合、かつその場合に限り、 オブジェクトを返す。そうでなければ null を返す。 getExtension から返されるオブジェクトは、その拡張によって提供される任意の定数または 関数を含む。拡張が何も定義しない場合、返されるオブジェクトは定数や関数を持たないことがあるが、 それでも一意のオブジェクトが返されなければならない。そのオブジェクトは、拡張が有効化されたことを 示すために使用される。

WebGLContextEvent

WebGL は、WebGL レンダリングコンテキストの状態における重要な変更に応答して WebGLContextEvent イベントを生成する。イベントは DOM Event System [DOM3EVENTS] を用いて送信され、WebGL レンダリングコンテキストに 関連付けられた HTMLCanvasElement または OffscreenCanvas へ dispatch される。 WebGLContextEvent イベントをトリガーし得る状態変更の種類は、 コンテキストの喪失コンテキストの復元、および コンテキストを作成できないことである。

e という名前の WebGL コンテキストイベントを発火する とは、WebGLContextEvent インターフェイスを用いる event が、 その type 属性 [DOM4]e に初期化し、 その cancelable 属性を true に初期化し、かつ その isTrusted 属性 [DOM4] を true に初期化して、指定されたオブジェクトに dispatch されることを意味する。

[Exposed=(Window,Worker)]
interface WebGLContextEvent : Event {
    constructor(DOMString type, optional WebGLContextEventInit eventInit = {});
    readonly attribute DOMString statusMessage;
};

// EventInit is defined in the DOM4 specification.
dictionary WebGLContextEventInit : EventInit {
    DOMString statusMessage = "";
};

この節で キューに入れられる すべての tasks [HTML]task source は、WebGL task source である。

属性

次の属性が利用できる。

statusMessage 型は DOMString
追加情報を含む文字列、または追加情報が利用できない場合は空文字列。

コンテキスト喪失イベント

ユーザーエージェントが、WebGLRenderingContext context に関連付けられた drawing buffer が喪失したことを検出した場合、次の手順を実行しなければならない。

  1. canvascontextcanvas とする。
  2. context の webgl context lost フラグが 設定されている場合、これらの手順を中止する。
  3. contextwebgl context lost フラグを設定する。
  4. この context によって作成された各 WebGLObject インスタンスの invalidated flag を設定する。
  5. "WEBGL_lose_context" 以外のすべての拡張を無効化する。
  6. 次の手順を実行するために task をキューに入れる
    1. canvas に対して、statusMessage 属性を "" に設定して、 "webglcontextlost" という名前の WebGL context event を発火する。
    2. event の canceled flag が設定されていない場合、これらの手順を中止する。
    3. 次の手順を非同期に実行する。
    4. 復元可能な drawing buffer を待機する。
    5. contextdrawing buffer を復元するために task をキューに入れる。

コンテキストが喪失している間に作成された WebGLObject (たとえば createBuffer() による WebGLBuffer)は、 その invalidated flag が設定された状態で 生存を開始する。

次のコードは、webglcontextlost イベントのデフォルトの振る舞いを防ぎ、 webglcontextrestored イベントが配信されるようにする。
canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false); 

コンテキスト復元イベント

ユーザーエージェントが WebGLRenderingContext context のために drawing buffer を復元することになっている場合、次の手順を実行しなければならない。

  1. canvascontext に関連付けられた canvas オブジェクトとする。
  2. contextwebgl context lost flag が 設定されていない場合、これらの手順を中止する。
  3. contextcontext creation parameters で指定された設定を用いて drawing buffer を作成し、 その drawing buffercontext に関連付け、 以前の drawing buffer を破棄する。
  4. contextwebgl context lost flag をクリアする。
  5. context の OpenGL エラー状態をリセットする。
  6. canvas に対して、statusMessage 属性を "" に設定して、 "webglcontextrestored" という名前の WebGL context event を発火する。

コンテキストが復元されると、コンテキストが復元される前に作成された texture や buffer などの WebGL リソースはもはや有効ではない。 以前に有効化された拡張は復元されない。 アプリケーションは、変更されたすべての状態、および破棄された拡張とリソースを復元する必要がある。
次のコードは、アプリケーションがコンテキストの喪失と復元をどのように処理できるかを示す。
function initializeGame() {
  initializeWorld();
  initializeResources();
}

function initializeResources() {
  initializeShaders();
  initializeBuffers();
  initializeTextures();

  // ready to draw, start the main loop
  renderFrame();
}

function renderFrame() {
  updateWorld();
  drawSkyBox();
  drawWalls();
  drawMonsters();

  requestId = window.requestAnimationFrame(
      renderFrame, canvas);
}

canvas.addEventListener(
    "webglcontextlost", function (event) {

  // inform WebGL that we handle context restoration
  event.preventDefault();

  // Stop rendering
  window.cancelAnimationFrame(requestId);
}, false);

canvas.addEventListener(
    "webglcontextrestored", function (event) {

  initializeResources();
}, false);

initializeGame();

コンテキスト作成エラーイベント

ユーザーエージェントが canvas に対して WebGL context creation error を発火することになっている場合、次の手順を実行しなければならない。

  1. canvas に対して、失敗の性質に関するプラットフォーム依存の文字列に statusMessage 属性を任意で設定して、 "webglcontextcreationerror" という名前の WebGL context event を発火する。

次のコードは、アプリケーションがコンテキスト作成の失敗に関する情報を取得する方法を示す。
var errorInfo = "";
function onContextCreationError(event) {

  canvas.removeEventListener(
     "webglcontextcreationerror",
     onContextCreationError, false);

  errorInfo = e.statusMessage || "Unknown";
}

canvas.addEventListener(
    "webglcontextcreationerror",
    onContextCreationError, false);

var gl = canvas.getContext("webgl");
if(!gl) {
  alert("A WebGL context could not be created.\nReason: " +
        errorInfo);
}

WebGL と OpenGL ES 2.0 の相違点

この節では、さまざまなオペレーティングシステムおよびデバイス間での移植性を向上させるために、 OpenGL ES 2.0 API に対して WebGL API に加えられた変更について記述する。

Buffer オブジェクトのバインディング

WebGL API では、ある buffer オブジェクトは、その生存期間中に ARRAY_BUFFER または ELEMENT_ARRAY_BUFFER バインディングポイントのいずれか一方にのみバインドできる。 この制限は、ある buffer オブジェクトが vertices または indices のいずれかを含み得るが、 両方を含むことはできないことを意味する。

WebGLBuffer の型は、それが bindBuffer への引数として初めて渡されたときに 初期化される。同じ WebGLBuffer を他方のバインディングポイントへバインドしようとする 後続の bindBuffer 呼び出しは、INVALID_OPERATION エラーを生成し、 バインディングポイントの状態は変更されないままとなる。

クライアント側配列なし

WebGL API はクライアント側配列をサポートしない。

vertex attribute が enableVertexAttribArray によって array として有効化されているが、 その attribute に buffer がバインドされていない場合(一般に bindBuffer および vertexAttribPointer による)、draw コマンド(drawArrays または drawElements)は INVALID_OPERATION エラーを生成する。

indexed draw コマンド(drawElements)が呼び出され、ELEMENT_ARRAY_BUFFER バインディングポイントに WebGLBuffer がバインドされていない場合、 INVALID_OPERATION エラーが生成される。

ARRAY_BUFFER バインディングポイントに WebGLBuffer がバインドされていない状態で vertexAttribPointer が呼び出され、かつ offset が非ゼロである場合、 INVALID_OPERATION エラーが生成される。

クライアント側配列が決してサポートされないにもかかわらず VERTEX_ATTRIB_ARRAY_BUFFER_BINDING を null に設定することを許可することで、 バインディングを元の状態にクリアできるようになる。これは、それ以外では厳密には不可能である。

これは、非デフォルト VAO オブジェクトについての OpenGL ES 3.0.5 [GLES30] p25 の振る舞いにも一致する。

デフォルトテクスチャなし

WebGL API はデフォルトテクスチャをサポートしない。texture 関連の操作および問い合わせが 成功するためには、非 null の WebGLTexture オブジェクトがバインドされていなければならない。

Shader バイナリなし

コンパイル済み shaders のバイナリ表現へのアクセスは、WebGL API ではサポートされない。 これには OpenGL ES 2.0 の ShaderBinary エントリポイントが含まれる。 加えて、getParameter を介して shader バイナリ形式および shader compiler の 利用可能性を問い合わせることは、WebGL API ではサポートされない。

すべての WebGL 実装は、オンライン shader compiler を暗黙にサポートしなければならない。

Buffer Offset および Stride の要件

drawElements および vertexAttribPointer への offset 引数、 ならびに vertexAttribPointer への stride 引数は、 呼び出しへ渡されたデータ型のサイズの倍数でなければならず、そうでない場合 INVALID_OPERATION エラーが生成される。

これは OpenGL ES 2.0.25 [GLES20] p24 からの次の要件を強制する。

"Clients must align data elements consistent with the requirements of the client platform, with an additional base-level requirement that an offset within a buffer to a datum comprising N basic machine units be a multiple of N."

加えて、drawElements への offset 引数は非負でなければならず、 そうでない場合 INVALID_VALUE エラーが生成される。

有効化された Vertex Attributes と範囲チェック

active vertex attribute のためのデータのフェッチを必要とする drawing コマンドを呼び出すことで、 draw コマンドが WebGLBuffer の境界外のデータを要求する可能性がある。 これは、その attribute が array として有効化されているときに、直接(drawArrays)、 または indexed draw(drawElements)から間接的に起こる。 これが発生した場合、次の振る舞いのいずれかになる。

  1. WebGL 実装は INVALID_OPERATION エラーを生成し、geometry を描画しなくてもよい。
  2. 範囲外の vertex fetch は、次のいずれかの値を返してもよい。

この振る舞いは [KHRROBUSTACCESS] で定義されるものを再現する。

vertex attribute が array として有効化され、その attribute に buffer がバインドされているが、 その attribute が現在の program によって消費されない場合、バインドされた buffer のサイズに かかわらず、drawArrays または drawElements の呼び出し中に エラーは生成されない。

index buffer からの範囲外 fetch

ELEMENT_ARRAY_BUFFER の境界外にある index 要素をフェッチする indexed drawing コマンド (drawElements)を呼び出すと、INVALID_OPERATION エラーになる。

Framebuffer オブジェクトの Attachments

WebGL は、DEPTH_STENCIL_ATTACHMENT framebuffer object attachment point と DEPTH_STENCIL renderbuffer internal format を追加する。depth buffer と stencil buffer の両方を framebuffer object にアタッチするには、DEPTH_STENCIL internal format で renderbufferStorage を呼び出し、その後 DEPTH_STENCIL_ATTACHMENT attachment point で framebufferRenderbuffer を呼び出す。

DEPTH_ATTACHMENT attachment point にアタッチされた renderbuffer は、 DEPTH_COMPONENT16 internal format で割り当てられなければならない。 STENCIL_ATTACHMENT attachment point にアタッチされた renderbuffer は、 STENCIL_INDEX8 internal format で割り当てられなければならない。 DEPTH_STENCIL_ATTACHMENT attachment point にアタッチされた renderbuffer は、 DEPTH_STENCIL internal format で割り当てられなければならない。

WebGL API では、次の attachment point の組み合わせに renderbuffers を同時にアタッチすることは エラーである。

上記の制約のいずれかに違反した場合、次のようになる。 次の framebuffer object attachments の組み合わせは、すべての attachments が framebuffer attachment complete、非ゼロ、かつ同じ width と height を持つ場合、 framebuffer が framebuffer complete になる結果をもたらさなければならない。

Texture Upload の Width と Height

width および height パラメーターが明示的に指定されない限り、 texImage2D によって設定される texture の width と height、および texSubImage2D によって更新される部分矩形の width と height は、 アップロードされる TexImageSource source オブジェクトに基づいて決定される。

ImageData 型の source
texture の width と height は、ImageData オブジェクトの width および height プロパティの 現在値に設定され、ImageData オブジェクトの実際のピクセル width と height を表す。
HTMLImageElement 型の source
bitmap がアップロードされる場合、texture の width と height は、アップロードされた bitmap の ピクセル単位の width と height に設定される。SVG 画像がアップロードされる場合、texture の width と height は、HTMLImageElement オブジェクトの width および height プロパティの現在値に設定される。
HTMLCanvasElement または OffscreenCanvas 型の source
texture の width と height は、HTMLCanvasElement または OffscreenCanvas オブジェクトの width および height プロパティの現在値に設定される。
HTMLVideoElement または VideoFrame[WEBCODECS] 型の source
texture の width と height は、動画のアップロードされた frame のピクセル単位の width と height に設定される。

Pixel Storage Parameters

WebGL API は、pixelStorei に対して次の追加パラメーターをサポートする。

UNPACK_FLIP_Y_WEBGL 型は boolean
設定されている場合、以後の texImage2D または texSubImage2D の呼び出し中、ソースデータは垂直軸に沿って反転され、 概念的には最後の行が最初に転送される行となる。初期値は false である。 任意の非ゼロ値は true と解釈される。
UNPACK_PREMULTIPLY_ALPHA_WEBGL 型は boolean
設定されている場合、以後の texImage2D または texSubImage2D の呼び出し中、存在するならソースデータの alpha channel は、 データ転送中に color channels へ乗算される。初期値は false である。 任意の非ゼロ値は true と解釈される。
UNPACK_COLORSPACE_CONVERSION_WEBGL 型は unsigned long
BROWSER_DEFAULT_WEBGL に設定されている場合、ブラウザーのデフォルトの colorspace conversion(例: display-p3 画像を srgb へ変換すること)が、TexImageSource 型の 引数を取る以後の texture data upload 呼び出し(例: texImage2D および texSubImage2D)中に適用される。 正確な変換は、ブラウザーとファイル型の両方に固有であり得る。 NONE に設定されている場合、RGBA への変換を除き、colorspace conversion は 適用されない。 (たとえば、rec709 YUV 動画は依然として rec709 RGB データに変換されるが、 その後さらに srgb RGB データなどへは変換されない) 初期値は BROWSER_DEFAULT_WEBGL である。

TexImageSourceImageBitmap である場合、これら 3 つのパラメーターは 無視される。代わりに、目的の形式を持つ ImageBitmap を作成するために、 同等の ImageBitmapOptions が使用されるべきである。

Framebuffer の外側のピクセルの読み取り

[読み取り操作] について、 範囲外ピクセルの sub-areas からの読み取りは、対応する宛先 sub-areas に触れない。

WebGL はリソースをゼロで事前初期化する(かのように振る舞う)。 したがって、たとえば copyTexImage2D では、範囲外 framebuffer 読み取りに 対応する sub-areas にゼロが入る。

Stencil の分離 Mask と Reference Value

WebGL API では、stencil testing が有効で、現在バインドされている framebuffer に stencil buffer が ある場合、次のいずれかの条件が真である間に描画することは不正である。 そうすると INVALID_OPERATION エラーが生成される。

ここで maxStencilValue((1 << s) - 1) であり、 s は draw framebuffer 内の stencil bits の数である。 (stencil bits が存在しない場合、これらのチェックは常に通る。)

Vertex Attribute Data Stride

WebGL API は、255 バイトまでの vertex attribute data strides をサポートする。 stride パラメーターの値が 255 を超える場合、vertexAttribPointer の呼び出しは INVALID_VALUE エラーを生成する。

Viewport Depth Range

WebGL API は、near plane が far plane の値より大きい値へマップされる depth ranges を サポートしない。zNearzFar より大きい場合、 depthRange の呼び出しは INVALID_OPERATION エラーを生成する。

Constant Color による Blending

WebGL API では、constant color と constant alpha を blend function の source および destination factors として一緒に使用することはできない。2 つの factors の一方が CONSTANT_COLOR または ONE_MINUS_CONSTANT_COLOR に設定され、他方が CONSTANT_ALPHA または ONE_MINUS_CONSTANT_ALPHA に設定されている場合、 blendFunc の呼び出しは INVALID_OPERATION エラーを生成する。 srcRGBCONSTANT_COLOR または ONE_MINUS_CONSTANT_COLOR に設定され、dstRGBCONSTANT_ALPHA または ONE_MINUS_CONSTANT_ALPHA に設定されている場合、 またはその逆の場合、blendFuncSeparate の呼び出しは INVALID_OPERATION エラーを生成する。

固定小数点サポート

WebGL API は GL_FIXED データ型をサポートしない。

GLSL Constructs

サポートされる GLSL Constructs に従い、 "webgl_" および "_webgl_" で始まる identifiers は WebGL による使用のために予約される。

拡張の問い合わせ

OpenGL ES 2.0 API では、利用可能な拡張は glGetString(GL_EXTENSIONS) を呼び出すことで 決定され、これはスペース区切りの拡張文字列のリストを返す。 WebGL API では、EXTENSIONS enumerant は削除されている。 代わりに、利用可能な拡張の集合を決定するために getSupportedExtensions が 呼び出されなければならない。

圧縮テクスチャサポート

中核 WebGL 仕様は、サポートされる圧縮テクスチャ形式を定義しない。 したがって、他の拡張が有効化されていない場合、

WebGL 実装は、非圧縮形式よりも効率的な圧縮テクスチャ形式のみを公開すべきである。

GLSL トークンの最大サイズ

GLSL ES 仕様 [GLES20GLSL] は、トークンの長さに制限を定義していない。 WebGL は 256 文字までの長さのトークンをサポートすることを要求する。256 文字より長いトークンを 含む shaders はコンパイルに失敗しなければならない。

GLSL ソース文字集合の外側の文字

WebGL は、任意の HTML DOMString [DOMSTRING]shaderSource へエラーなしで渡すことをサポートする。 ただし shader コンパイル中、GLSL preprocessing およびコメント除去の後、残るすべての文字は [GLES20GLSL] の文字集合内になければならない。 そうでなければ、shader はコンパイルに失敗しなければならない。

特に、これは次を許可する。

GLSL ES 仕様 [GLES20GLSL] は、OpenGL ES shading language の ソース文字集合を ISO/IEC 646:1991 の部分集合として定義しており、これは一般に ASCII [ASCII] と呼ばれる。 一部の GLSL 実装は、コメント内であっても ASCII 範囲外の任意の文字を許可しない。 ブラウザーは完全な DOMString 文字集合の preprocessing を正しく処理しなければならない一方で、 WebGL 実装は一般に、安全のため GLSL driver へ送られる shader source が ASCII のみを 含むことを保証しなければならない。 実装は、必要に応じて空行を挿入するなどして、デバッグ目的で行番号を保持すべきである。

この集合に含まれない文字を含む文字列が、他の shader 関連エントリポイント bindAttribLocationgetAttribLocation、 または getUniformLocation のいずれかへ渡された場合、 INVALID_VALUE エラーが生成される。

GLSL Shaders における構造体の最大ネスト

WebGL は、GLSL shaders における構造体のネストに制限を課す。ネストは、struct 内の field が 別の struct 型を参照するときに発生する。GLSL ES 仕様 [GLES20GLSL] は埋め込み構造体定義を禁止する。 top-level struct 定義内の fields はネストレベル 1 を持つ。

WebGL は、構造体ネストレベル 4 のサポートを要求する。4 レベルより深くネストされた構造体を 含む shaders はコンパイルに失敗しなければならない。

Uniform および Attribute Location の最大長

WebGL は、uniform および attribute locations の長さに 256 文字の制限を課す。

String Length Queries

WebGL API では、INFO_LOG_LENGTHSHADER_SOURCE_LENGTHACTIVE_UNIFORM_MAX_LENGTH、および ACTIVE_ATTRIBUTE_MAX_LENGTH enumerants は 削除されている。OpenGL ES 2.0 API では、これらの enumerants は glGetActiveAttrib などの呼び出しへ渡される buffer のサイズを決定するために必要である。 WebGL API では、類似する呼び出し(getActiveAttribgetActiveUniformgetProgramInfoLoggetShaderInfoLog、 および getShaderSource)はすべて DOMString を返す。

TexSubImage2D 呼び出しにおける Texture Type

WebGL API では、texSubImage2D へ渡される type 引数は、 texture オブジェクトを最初に定義するために使用された型(すなわち texImage2D を使用)と 一致しなければならない。

Uniforms および Varyings のパッキング制限

OpenGL ES Shading Language, Version 1.00 [GLES20GLSL] の Appendix A, Section 7 "Counting of Varyings and Uniforms" は、shader 内のすべての uniform および varying 変数に必要なストレージを計算するための保守的なアルゴリズムを定義する。 GLSL ES 仕様は、Appendix A で定義されるパッキングアルゴリズムが成功する場合、 shader はターゲットプラットフォーム上でコンパイルに成功しなければならないことを要求する。 WebGL API はさらに、そのパッキングアルゴリズムが shader の uniform 変数について、または program の varying 変数について失敗する場合、コンパイルまたはリンクが失敗しなければならないことを 要求する。

固定サイズの register grid を使用する代わりに、ターゲットアーキテクチャ内の rows の数は 次の方法で決定される。

上記のテキストは、パッキングアルゴリズムによって強制される制約により shader または program のコンパイルまたはリンクが失敗しなければならない状況を定義する。 このアルゴリズムに従って変数が正常にパックされる、最小要求量より多くの変数を使用する shader が正常にコンパイルされることは保証されない。 scalar arrays が複数の columns を消費するように展開されることを含め、実装における非効率が 観察されている。開発者は、複数の変数を columns へ自動的にパックすることに大きく依存するのを 避けるべきである。代わりに、より大きな変数(vec4 など)を定義し、値を右端の columns へ 明示的にパックすること。

Textures と Framebuffer の間のフィードバックループ

OpenGL ES 2.0 API では、同じ texture に対して書き込みと読み取りの両方を行う呼び出しを作成し、 フィードバックループを作ることが可能である。 そのようなフィードバックループが存在する場合、未定義の振る舞いになると指定されている。

WebGL API では、(OpenGL ES 2.0 仕様内の定義によって)そのようなフィードバックループを 引き起こす操作は、代わりに INVALID_OPERATION エラーを生成する。

欠落した Attachment からの読み取り

OpenGL ES 2.0 API では、color attachment を持たない complete framebuffer から color data の ReadPixels を行うなど、コマンドが欠落した attachment からデータを取得しようとすると何が起こるかは 指定されていない。

WebGL API では、欠落している attachment からのデータを必要とする任意の [読み取り操作] は、 INVALID_OPERATION エラーを生成する。

欠落した Attachment への描画

OpenGL ES 2.0 API では、color attachment を持たない complete framebuffer から draw buffer を クリアするなど、コマンドが欠落した attachment へ描画しようとすると何が起こるかは 指定されていない。

WebGL API では、欠落している attachment へ描画する任意の [描画操作] は、その attachment へは何も描画しない。 エラーは生成されない。

NaN Line Width

WebGL API では、lineWidth へ渡される width パラメーターが NaN に設定されている場合、INVALID_VALUE エラーが生成され、line width は変更されない。

Attribute Aliasing

アプリケーションが複数の attribute 名を同じ location へバインドすることは可能である。 これは aliasing と呼ばれる。同じ location へ alias された複数の attributes が実行可能 program 内で active である場合、linkProgram は失敗すべきである。

gl_Position の初期値

GLSL ES [GLES20GLSL] 仕様は、vertex shader 内で書き込まれない限り、 gl_Position の値を未定義のままにしている。WebGL は、gl_Position の初期値が (0,0,0,0) であることを保証する。

GLSL ES グローバル変数の初期化

GLSL ES 1.00 [GLES20GLSL] 仕様は、グローバル変数 initializer を constant expressions に制限する。WebGL API では、GLSL ES 1.00 shaders 内の global variable initializers で、const qualifier で修飾されていない他の グローバル変数および uniform 値を使用することが許可される。Global variable initializers は global initializer expressions でなければならず、これは次のいずれかとして定義される。

次のものは global initializer expressions で使用してはならない。

global variable initializer が未変更の GLSL ES 仕様に違反している場合、すなわち global variable initializer が constant expression でない場合、compilers は警告を生成すべきである。

この振る舞いは WebGL 実装において数年間存在してきた。この振る舞いを GLSL ES 仕様と一致するように 修正すると、既存コンテンツとの互換性に大きな影響が生じる。

GLSL ES Preprocessor "defined" Operator

GLSL ES preprocessor 仕様が参照する C++ 標準では、#if または #elif directive の controlling expression を解析する際に、defined operator が macro replacement によって生成される場合の振る舞いは未定義である。WebGL API によって処理される shader code が、preprocessor expression 内の macro replacement 中に defined トークンを 生成する場合、それは compiler error にならなければならない。

これは、defined operator を扱う preprocessor directives の外側での macro expansion には 影響しない。

defined を macro 名として使用することも C++ 標準では未定義の振る舞いである。 WebGL API では、defined を macro 名として使用することは compiler error にならなければならない。

WebGL API の振る舞いは、native API 仕様が未定義の振る舞いを許す場合に一貫しているべきである。

GLSL ES #extension directive location

GLSL ES 1.00 [GLES20GLSL] 仕様は、 extension 仕様が別途述べない限り、#extension directives が任意の non-preprocessor tokens より前に現れなければならないことを義務付けている。 WebGL API では、#extension directives は GLSL ES 1.00 shaders 内の non-preprocessor tokens の後に常に現れてよい。GLSL ES 1.00 shaders 内の #extension directives の scope は常に shader 全体であり、後から現れる #extension directives は、shader 全体について前に見られたものを上書きする。

拡張に #extension directives を配置すべき場所を決定させることは、 仕様に多くの解釈の余地をもたらしてきた。実際には GLES 実装は GLSL ES 仕様に書かれている 規則を強制しておらず、WebGL 実装も同様であるため、既存コンテンツとの互換性を保ちながら 仕様を明確に定義する唯一の方法は、その規則を緩和することである。

Cube Map Framebuffer Attachments の完全性

WebGL API では、cube complete でない cube map の面は framebuffer attachment complete ではない。 incomplete cube map の面がアタッチされているときに framebuffer status を問い合わせると、 FRAMEBUFFER_INCOMPLETE_ATTACHMENT を返さなければならない。

recent OpenGL core versions および OpenGL ES 3.0 以降を含む、WebGL が実装される API には、 framebuffer attachment として使用される cube map faces が cube complete cube map の一部でなければ ならないという要件がある。たとえば、 OpenGL ES 3.0.4 §4.4.4 "Framebuffer Completeness", subsection "Framebuffer Attachment Completeness" を参照。

current program が null のときの vertices の転送

vertices を GL へ転送する任意のコマンドは、CURRENT_PROGRAM が null である場合、 INVALID_OPERATION を生成する。これには drawElements および drawArrays が含まれる。

Fragment shader output

fragment shader が gl_FragColor にも gl_FragData にも書き込まない場合、 shader 実行後の fragment colors の値は変更されない。

GLSL local および global 変数の初期値

GLSL ES [GLES20GLSL] 仕様は、local および global 変数の値を、 shader によって初期化されない限り未定義のままにしている。WebGL は、そのような変数がゼロに 初期化されることを保証する: 0.0vec4(0.0)0false など。

正規化された符号付き整数から浮動小数点への Vertex attribute 変換

OpenGL ES 2.0 仕様 [GLES20] section 2.1.2 "Data Conversions", subsection "Conversion from Integer to Floating-Point" は、正規化された符号付き整数 c (その型の bit width が b)から浮動小数点値 f への変換を次のように定義する。

f = (2*c + 1) / (2^b - 1)
符号付き正規化 vertex attributes から浮動小数点への変換中、WebGL 1.0 実装は任意で、 ゼロを保持する次の変換規則を使用してよい。
f = max(c / (2^(b - 1) - 1), -1.0)
WebGL 1.0 が構築される一部の API は 2 番目の規則を使用し、この変換は fixed-function hardware で 行われるため、一方の振る舞いをもう一方へエミュレートすることはできない。 この振る舞いの違いはほとんどのアプリケーションに影響しないため、どの振る舞いが使用されているかを 決定する問い合わせは WebGL rendering context に追加されていない。

Uniform と attribute の名前衝突

WebGL program にアタッチされた shaders のいずれかが、静的に使用される vertex attribute と同じ名前の uniform を宣言する場合、program linking は失敗すべきである。

この振る舞いは GLSL ES 3.00.6 section 12.47 で指定されるものと異なる。
一部の OpenGL drivers が同じ名前の uniforms と vertex attributes を受け入れないため、 WebGL 実装は数年間この振る舞いを強制してきた。

Wide point primitive clipping

POINTS primitives は、vertex が clip volume の外側にあるが near および far clip planes の 内側にある場合、破棄される場合もあれば破棄されない場合もある。

wide points の clipping は GLES と GL で異なる振る舞いをし、この振る舞いの違いは実装で 回避するには困難である。

OpenGL ES 2.0.25 p46:

If the primitive under consideration is a point, then clipping discards it if it lies outside the near or far clip plane; otherwise it is passed unchanged.

OpenGL 3.2 Core p97:

If the primitive under consideration is a point, then clipping passes it unchanged if it lies within the clip volume; otherwise, it is discarded.

リンク失敗時に current program が無効化される

WebGL API では、linkProgram へ渡された program が useProgram によって 定義される使用中の current program object でもあり、link が成功しなかった場合、 current rendering state が参照する実行可能コードはただちに無効化される。 current program を利用する以後の draw calls は INVALID_OPERATION エラーを生成する。

relink に失敗した programs に対して draw calls を即座に拒否することは、WebGL 実装を より堅牢にする。OpenGL ES API の振る舞いは、current program が変更されるまで current executable が保持されるというものである。この振る舞いをすべてのシナリオで正しく実装することは 困難であり、セキュリティバグにつながってきた。

Shader Identifiers 内の Double-Underscore

shaders 内の identifiers は、たとえば "g__Foo" のように、double-underscores を含んでもよい。

堅牢な移植性を確保するため、基盤となる driver がこれをサポートしない場合でも、実装はこれを サポートしなければならない。(たとえば mangling によって)

参考文献

[CANVAS]
HTML5: Canvas 要素, World Wide Web Consortium (W3C).
[OFFSCREENCANVAS]
HTML Living Standard - OffscreenCanvas インターフェイス, WHATWG.
[CANVASCONTEXTS]
Canvas Context Registry, WHATWG.
[ECMASCRIPT]
ECMAScript® 2015 Language Specification, Ecma International, 2015.
[GL32CORE]
The OpenGL® Graphics System: A Specification (Version 3.2 (Core Profile) - December 7, 2009), M. Segal, K. Akeley, December 2009.
[GLES20]
OpenGL® ES Common Profile Specification Version 2.0.25, A. Munshi, J. Leech, November 2010.
[GLES20GLSL]
The OpenGL® ES Shading Language Version 1.00, R. Simpson, May 2009.
[REGISTRY]
WebGL Extension Registry
[RFC2119]
RFC で要件レベルを示すために用いるキーワード, S. Bradner. IETF, March 1997.
[CSS]
Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification, B. Bos, T. Celik, I. Hickson, H. W. Lie, June 2011.
[CORS]
Cross-Origin Resource Sharing, A. van Kesteren, July 2010.
[DOM4]
DOM4, A. van Kesteren, A. Gregor, Ms2ger.
[DOM3EVENTS]
Document Object Model (DOM) Level 3 Events Specification, Doug Schepers and Jacob Rossi. W3C.
[HTML]
HTML, I. Hickson, June 2011.
[WEBIDL]
Web IDL - Living Standard, E. Chen, T. Gu, B. Zbarsky, C. McCormack, T. Langel.
[ASCII]
International Standard ISO/IEC 646:1991. Information technology - ISO 7-bit coded character set for information interchange
[DOMSTRING]
Document Object Model Core: DOMString 型, World Wide Web Consortium (W3C).
[KHRROBUSTACCESS]
KHR_robust_buffer_access_behavior OpenGL ES extension, Leech, J. and Daniell, P., August, 2014.
[MULTIPLEBUFFERING]
(Non-normative) Multiple buffering. Wikipedia.
[WEBCODECS]
(Non-normative) WebCodecs API, C. Cunningham, P. Adenot, B. Aboba. W3C.
[PREDEFINEDCOLORSPACE]
HTML Living Standard - PredefinedColorSpace enum, WHATWG.
[WEBGPU]
WebGPU Editor's Draft, WebGPU Community Group.

謝辞

この仕様は Khronos WebGL Working Group によって作成されている。

特別な謝意を表する: Arun Ranganathan (Mozilla), Chris Marrin (Apple), Jon Leech, Kenneth Russell (Google), Kenneth Waters (Google), Mark Callow (HI), Mark Steele (Mozilla), Oliver Hunt (Apple), Tim Johansson (Opera), Vangelis Kokkevis (Google), Vladimir Vukicevic (Mozilla), Gregg Tavares (Google)

追加の謝意を表する: Alan Hudson (Yumetech), Benoit Jacob (Mozilla), Bill Licea Kane (AMD), Boris Zbarsky (Mozilla), Cameron McCormack (Mozilla), Cedric Vivier (Zegami), Dan Gessel (Apple), David Ligon (Qualcomm), David Sheets (Ashima Arts), Glenn Maynard, Greg Roth (Nvidia), Jacob Strom (Ericsson), Jeff Gilbert (Mozilla), Kari Pulli (Nokia), Teddie Stenvi (ST-Ericsson), Neil Trevett (Nvidia), Per Wennersten (Ericsson), Per-Erik Brodin (Ericsson), Shiki Okasaka (Google), Tom Olson (ARM), Zhengrong Yao (Ericsson), and the members of the Khronos WebGL Working Group.