この仕様は、 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] に対して新しいオブジェクトを
返すことになっている場合、ユーザーエージェントは次の手順を実行しなければならない。
WebGLRenderingContext オブジェクト context を作成する。
getContext() メソッドが関連付けられている canvas または offscreen
canvas とする。
WebGLContextAttributes オブジェクト contextAttributes を作成する。
getContext() が第 2 引数 options 付きで呼び出された場合、
contextAttributes の属性を options で指定されたものから設定する。
WebGLContextAttributes オブジェクト actualAttributes を作成する。
canvas コンテキスト型 'experimental-webgl' は歴史的に、まだ完全ではない、または 適合していない WebGL 実装へのアクセスを提供するために使用されてきた。
ユーザーエージェントが webgl と experimental-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 もしくは OffscreenCanvas の
width および 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 の最初の呼び出し時にのみ使用される。描画バッファの作成後に
その属性を変更する機能は提供されない。
depth、stencil および antialias 属性が true に
設定されている場合、それらは要求であり、要件ではない。WebGL 実装はそれらを尊重するために
最善の努力を行うべきである。ただし、これらの属性のいずれかが false に設定されている場合、
WebGL 実装は関連する機能を提供してはならない。WebGL 実装またはグラフィックスハードウェアで
サポートされていない属性の組み合わせは、WebGLRenderingContext の作成に失敗させてはならない。
実際のコンテキスト
パラメーターは、作成された描画バッファの属性に設定される。
alpha、premultipliedAlpha および
preserveDrawingBuffer 属性は、WebGL 実装によって従われなければならない。
WebGL は、合成処理の直前に描画バッファを HTML ページコンポジターへ提示するが、 前回の合成処理以降に次のいずれかが呼び出された場合に限られる。
描画バッファが合成のために提示される前に、実装はすべてのレンダリング操作が描画バッファへ フラッシュされていることを保証しなければならない。デフォルトでは、合成後、描画バッファの 内容は上の表に示されるデフォルト値へクリアされなければならない。
このデフォルトの振る舞いは、
WebGLContextAttributes オブジェクトの
preserveDrawingBuffer 属性を設定することで変更できる。このフラグが true の場合、
描画バッファの内容は、著者がそれらをクリアまたは上書きするまで保持されなければならない。
このフラグが false の場合、レンダリング関数が返った後にこのコンテキストをソース画像として
使用する操作を試みると、未定義の振る舞いにつながる可能性がある。これには、
readPixels または toDataURL 呼び出し、このコンテキストを
別のコンテキストの texImage2D または drawImage 呼び出しの
ソース画像として使用すること、またはこのコンテキストの canvas から
ImageBitmap [HTML]
を作成することが含まれる。
描画バッファを保持することが望ましい場合もあるが、一部のプラットフォームでは大きな
性能低下を引き起こす可能性がある。可能な限り、このフラグは false のままにし、
他の手法を用いるべきである。同期的な描画バッファアクセス(たとえば描画バッファへ
レンダリングする同じ関数内で readPixels または toDataURL を
呼び出す)などの手法を用いて、描画バッファの内容を取得できる。著者が一連の呼び出しに
わたって同じ描画バッファへレンダリングする必要がある場合、
Framebuffer Object を使用できる。
実装は、著者が別のプロセスからバッファの内容へアクセスできないという保証ができる限り、 描画バッファの必要な暗黙のクリア操作を最適化によって省略してもよい。たとえば、著者が 明示的なクリアを実行する場合、暗黙のクリアは不要である。
renderbufferStorage と同様に、
描画バッファの形式およびサイズを再指定する。
クリアの振る舞いは、HTMLCanvasElement.width および
HTMLCanvasElement.height を設定し、その後描画バッファ形式を変更することと
同等である。このメソッドは WebGLContextAttributes.antialias を尊重する。
drawingBufferStorage は、width と height を同時にまとめて効率的に
再指定できるようにする。
HTMLCanvasElement.width および HTMLCanvasElement.height では、
片方を設定してからもう片方を設定すると、中間的な再割り当てが発生する可能性があるが、
ユーザーエージェントはそれらを最適化して取り除こうとする。
drawingBufferStorage が成功した場合、drawingBufferFormat は
sizedFormat になる。
drawingBufferWidth および drawingBufferHeight は、それぞれ
width および height になる。
したがって、デフォルト framebuffer 上の操作は、sizedFormat の添付を持つ
非デフォルト framebuffer 上で操作しているかのように振る舞う。
たとえば drawingBufferStorage(gl.RGBA16F, 1, 1) の後では、
framebuffer は "floatish" であるため、readPixels の主な format/type ペアは
RGBA/UNSIGNED_BYTE ではなく
RGBA/FLOAT になる。
WebGLContextAttributes.alpha が false の場合、
INVALID_OPERATION を生成する。
RGBA8 は sizedFormat に対して常にサポートされる。
さらに、次の列挙値は、現在 renderbufferStorage に対して有効な場合に
サポートされる。
RGBA8
SRGB8_ALPHA8 (0x8C43)(例: EXT_sRGB 由来)
RGBA16F (0x881A)(例: EXT_color_buffer_half_float 由来)
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 を生成する。
OpenGL は、その状態の一部として矩形のビューポートを管理し、これは描画バッファ内での レンダリング結果の配置を定義する。WebGL コンテキスト context の作成時に、 ビューポートは、原点が (0, 0) で、幅と高さが (context.drawingBufferWidth, context.drawingBufferHeight) に等しい矩形として初期化される。
WebGL 実装は、canvas 要素のリサイズに応じて OpenGL ビューポートの状態に影響を 与えてはならない。
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 ハンドラーを使用することが期待される。
OpenGL API は、アプリケーションがレンダリング中に使用されるブレンディングモードを
変更することを可能にし、そのため描画バッファ内のアルファ値がどのように解釈されるかを
制御できる。WebGLContextAttributes の節の
premultipliedAlpha パラメーターを参照。
HTML Canvas API の toDataURL および drawImage は、
premultipliedAlpha コンテキスト作成パラメーターを尊重しなければならない。
WebGL コンテンツがレンダリングされている Canvas に対して toDataURL が
呼び出された場合、要求された画像形式がプリマルチプライドアルファを指定しておらず、
WebGL コンテキストの premultipliedAlpha パラメーターが true に設定されているなら、
ピクセル値は非乗算化されなければならない。すなわち、色チャンネルはアルファチャンネルで
除算される。この操作は損失を伴うことに注意。
WebGL でレンダリングされた Canvas を CanvasRenderingContext2D の
drawImage メソッドに渡す場合、CanvasRenderingContext2D 実装の
プリマルチプライの必要性に応じて、描画操作中にレンダリング済みの WebGL コンテンツを
変更する必要がある場合もあれば、ない場合もある。
WebGL でレンダリングされた Canvas を texImage2D API に渡す場合、
渡された canvas の premultipliedAlpha コンテキスト作成パラメーターの設定と、
宛先 WebGL コンテキストの UNPACK_PREMULTIPLY_ALPHA_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 メソッドが、他の点では正しい
引数とともに、これらの制限に違反する HTMLImageElement、
HTMLVideoElement、HTMLCanvasElement、または
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 リクエストを発行することに関する詳細については、 次を参照。
WebGL 実装は、The OpenGL ES Shading Language, Version 1.00 [GLES20GLSL] に準拠し、かつ Appendix A の Sections 4 および 5 で 義務付けられている最小機能を超えない shader のみを受け入れなければならない。 特に次のとおりである。
for ループは Appendix A の構造的制約に準拠しなければならない。 while および do-while ループは、Appendix A では任意であるため、
許可されない。前述の仕様における予約識別子に加えて、"webgl_" および "_webgl_" で始まる識別子は WebGL による使用のために予約される。これらの接頭辞で始まる関数、変数、構造体名、 または構造体フィールドを宣言する shader は、読み込みを許可されてはならない。
WebGL 1.0 実装は、shader 内で行継続文字 '\' も追加でサポートしなければならない。
意図的または非意図的に、レンダリングに望ましくないほど長い時間を要する shader と ジオメトリの組み合わせを作成することが可能である。この問題は、ユーザーエージェントが すでに保護策を持つ長時間実行スクリプトの問題に類似している。しかし、長時間実行される draw 呼び出しは、ユーザーエージェントだけでなく、ウィンドウシステム全体の 対話性を失わせる可能性がある。
一般的な場合、この問題を防ぐために入力される shader の構造に制限を課すことはできない。 実験により、非常に厳格な構造的制限であっても長いレンダリング時間を防ぐには不十分であり、 そのような制限は shader の著者が一般的なアルゴリズムを実装することを妨げることが 示されている。
ユーザーエージェントは、過度に長いレンダリング時間およびそれに伴う対話性の喪失を 防ぐための保護策を実装すべきである。提案される保護策には次が含まれる。
OS およびグラフィックス API 層の支援インフラストラクチャは、時間とともに改善されることが 期待されるため、これらの保護策の正確な性質は指定されない。
Shaders は、アプリケーション自身のデータの外にある配列要素を読み書きすることを
許可されてはならない。これには、配列型の任意の変数に加えて、配列添字構文を用いて
アクセスされる場合の vec3 または mat4 などのベクトル型または
行列型も含まれる。コンパイル時に検出された場合、そのようなアクセスはエラーを生成し、
shader のコンパイルを防がなければならない。そうでなければ、実行時に範囲外読み取りは、
次のいずれかの値を返さなければならない。
範囲外書き込みは破棄されるか、またはプログラムがアクセス可能なストレージ内の 未指定の値を変更する。
この振る舞いは、[KHRROBUSTACCESS] で定義されるものを再現する。
shader における配列添字操作の静的解析を簡略化する制限についての詳細は、 サポートされる GLSL 構文を参照。
この節は、上で記述された機能への実行時アクセスをサポートするために 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 辞書は描画サーフェス属性を含み、
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 パラメーターが渡されない場合、または渡されたユーザーオブジェクトに
指定された名前の属性がない場合のいずれかで使用される。
値が true の場合、ページコンポジターは描画バッファがプリマルチプライドアルファの 色を含むと仮定する。値が false の場合、ページコンポジターは描画バッファ内の色が プリマルチプライされていないと仮定する。このフラグは alpha フラグが false の場合は無視される。
premultipliedAlpha:true では、ページコンポジターへ送られるすべての
ピクセルは、色の値がそのアルファ値以下でなければならない。
そうでなければ、そのような範囲外のピクセル値を合成した結果の色は未定義である。
premultipliedAlpha:true で
vec4(1.0, 0.0, 0.0, 0.5) は、最適化されたパック合成演算の
オーバーフローにより、赤ではなく緑として表示される可能性がある。
一貫した振る舞いを要求することによる解決困難な性能への影響のため、
これは未定義のままとされる。
premultipliedAlpha フラグの効果に関する詳細は、
プリマルチプライドアルファを参照。
一部のハードウェアでは、preserveDrawingBuffer フラグを
true に設定すると重大な性能上の影響が生じる可能性がある。
この 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 要素を 使用する場合である。モバイルデバイスではバッテリー寿命を大幅に改善する可能性が あるため、コンテンツが許すなら、開発者はこの値を使用することが推奨される。
false のままにすべきである。高い性能を必要とするアプリケーションは
このパラメーターを true に設定してもよく、コンテキスト作成が失敗した場合、
アプリケーションは 2D canvas コンテキストなどのフォールバックレンダリング経路を
使用することを選択してもよい。あるいは、性能を改善するために低忠実度のレンダリングモードを
使用すべきであることを理解したうえで、このパラメーターを false に設定して
WebGL コンテキスト作成を再試行できる。
値が true の場合、ユーザーエージェントは、入力イベントからラスタライズまでで測定される レイテンシーを低減するために、canvas のペイントサイクルをイベントループから 非同期化する、通常のユーザーエージェントレンダリングアルゴリズムを迂回する、 またはその両方によって、canvas のレンダリングを最適化してもよい。このモードが 通常のペイント機構、ラスタライズ、またはその両方を迂回する限り、目に見える ティアリングアーティファクトを導入する可能性がある。
ユーザーエージェントは通常、表示されていないバッファ上にレンダリングし、
それを提示のために走査出力中のバッファと素早く入れ替える。前者のバッファは
バックバッファと呼ばれ、後者はフロントバッファと呼ばれる。
レイテンシーを低減するための一般的な手法はフロントバッファレンダリングと呼ばれ、
シングルバッファレンダリングとしても知られ、レンダリングが走査出力処理と
並行して競合的に発生する。この手法は、ティアリングアーティファクトを導入する
可能性という代償でレイテンシーを低減し、desynchronized
boolean の全部または一部を実装するために使用できる。
[MULTIPLEBUFFERING]
desynchronized boolean は、描画アプリケーションなど、
入力とラスタライズの間のレイテンシーが重要な特定の種類のアプリケーションを
実装する場合に有用であり得る。
getContext に渡す ECMAScript 例である。
ページ上に "canvas1" という名前の canvas 要素が存在することを仮定している。
var canvas = document.getElementById('canvas1');
var context = canvas.getContext('webgl',
{ antialias: false,
stencil: true });
WebGLObject インターフェイスは、すべての GL オブジェクトの親インターフェイスである。
各 WebGLObject は、初期状態では設定されていない
内部の invalidated フラグを持つ。
各 WebGLObject は .label 属性を持ち、そのデフォルトは
"" である。実装は、デバッグを改善するために、たとえばエラーメッセージで、
および/またはネイティブレベルのデバッグツールを支援するために可能であれば基盤となる
ドライバーへラベルを提供するために、このアプリケーション提供のラベル文字列を使用すべきである。
実装はラベルによって振る舞いを変更してはならない。
[Exposed=(Window,Worker)]
interface WebGLObject {
attribute USVString label;
};
WebGLBuffer インターフェイスは OpenGL Buffer Object を表す。
基盤となるオブジェクトは、glGenBuffers を呼び出したかのように作成され
(OpenGL
ES 2.0 §2.9、man ページ)
、glBindBuffer を呼び出したかのようにバインドされ
(OpenGL
ES 2.0 §2.9、man ページ)
、glDeleteBuffers を呼び出したかのように削除対象としてマークされる
(OpenGL
ES 2.0 §2.9、man ページ)
。
[Exposed=(Window,Worker)]
interface WebGLBuffer : WebGLObject {
};
WebGLFramebuffer インターフェイスは OpenGL Framebuffer Object を表す。
基盤となるオブジェクトは、glGenFramebuffers を呼び出したかのように作成され
(OpenGL
ES 2.0 §4.4.1、man ページ)
、glBindFramebuffer を呼び出したかのようにバインドされ
(OpenGL
ES 2.0 §4.4.1、man ページ)
、glDeleteFramebuffers を呼び出したかのように削除対象としてマークされる
(OpenGL
ES 2.0 §4.4.1、man
ページ)
。
[Exposed=(Window,Worker)]
interface WebGLFramebuffer : WebGLObject {
};
WebGLProgram インターフェイスは OpenGL Program Object を表す。
基盤となるオブジェクトは、glCreateProgram を呼び出したかのように作成され
(OpenGL
ES 2.0 §2.10.3、man ページ)
、glUseProgram を呼び出したかのように使用され
(OpenGL
ES 2.0 §2.10.3、man ページ)
、glDeleteProgram を呼び出したかのように削除対象としてマークされる
(OpenGL
ES 2.0 §2.10.3、man ページ)
。
[Exposed=(Window,Worker)]
interface WebGLProgram : WebGLObject {
};
WebGLRenderbuffer インターフェイスは OpenGL Renderbuffer Object を表す。
基盤となるオブジェクトは、glGenRenderbuffers を呼び出したかのように作成され
(OpenGL
ES 2.0 §4.4.3、man
ページ)
、glBindRenderbuffer を呼び出したかのようにバインドされ
(OpenGL
ES 2.0 §4.4.3、man
ページ)
、glDeleteRenderbuffers を呼び出したかのように削除対象としてマークされる
(OpenGL
ES 2.0 §4.4.3、man
ページ)
。
[Exposed=(Window,Worker)]
interface WebGLRenderbuffer : WebGLObject {
};
WebGLShader インターフェイスは OpenGL Shader Object を表す。
基盤となるオブジェクトは、glCreateShader を呼び出したかのように作成され
(OpenGL
ES 2.0 §2.10.1、man ページ)
、glAttachShader を呼び出したかのように Program へアタッチされ
(OpenGL
ES 2.0 §2.10.3、man ページ)
、glDeleteShader を呼び出したかのように削除対象としてマークされる
(OpenGL
ES 2.0 §2.10.1、man ページ)
。
[Exposed=(Window,Worker)]
interface WebGLShader : WebGLObject {
};
WebGLTexture インターフェイスは OpenGL Texture Object を表す。
基盤となるオブジェクトは、glGenTextures を呼び出したかのように作成され
(OpenGL
ES 2.0 §3.7.13、man ページ)
、glBindTexture を呼び出したかのようにバインドされ
(OpenGL
ES 2.0 §3.7.13、man ページ)
、glDeleteTextures を呼び出したかのように削除対象としてマークされる
(OpenGL
ES 2.0 §3.7.13、man ページ)
。
[Exposed=(Window,Worker)]
interface WebGLTexture : WebGLObject {
};
WebGLUniformLocation インターフェイスは、shader program 内の uniform 変数の
位置を表す。
[Exposed=(Window,Worker)]
interface WebGLUniformLocation {
};
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 インターフェイスは、
getShaderPrecisionFormat 呼び出しから返される情報を表す。
[Exposed=(Window,Worker)]
interface WebGLShaderPrecisionFormat {
readonly attribute GLint rangeMin;
readonly attribute GLint rangeMax;
readonly attribute GLint precision;
};
次の属性が利用できる。
rangeMin
型は GLint
rangeMax
型は GLint
precision
型は GLint
頂点、インデックス、テクスチャ、およびその他のデータは、 ArrayBuffer、 Typed Arrays および DataView を用いて WebGL 実装へ転送される。これらは ECMAScript 仕様 [ECMASCRIPT] で定義されている。
Typed Arrays は、インターリーブされた異種の頂点データの作成、大きな頂点バッファオブジェクトへの 個別のデータブロックのアップロード、および OpenGL プログラムで必要とされる ほとんどのその他のユースケースをサポートする。
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;
}
WebGLRenderingContext は、
canvas 要素内で OpenGL ES 2.0 スタイルのレンダリングを可能にする API を表す。
WebGLRenderingContext インターフェイスの任意のメソッド、
または getExtension メソッドによって返されるインターフェイスの任意のメソッドの
実装を実行する前に、次の手順が実行されなければならない。
[WebGLHandlesContextLoss] 拡張属性が現れる場合、
呼び出されたメソッドの実装を実行し、その結果を返して、これらの手順を終了する。 WebGLObject である場合、INVALID_OPERATION エラーを生成し、
use default return value を true とする。
any または任意の nullable 型である場合、
null を返す。 さらなる詳細については、コンテキスト喪失イベントを参照。
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)
drawingBufferWidth
型は GLsizei
HTMLCanvasElement の width 属性とは異なる場合がある。
drawingBufferHeight
型は GLsizei
HTMLCanvasElement の height 属性とは異なる場合がある。
drawingBufferFormat
型は GLenum
alpha:true および alpha:false に対して
それぞれ RGBA8 または RGB8 である。
drawingBufferColorSpace
型は
PredefinedColorSpace
(仕様)
unpackColorSpace
型は
PredefinedColorSpace
(仕様)
TexImageSource ソースが変換される先の色空間。
OpenGL ES 2.0 は、レンダリングで使用するための状態値を保持する。 このグループ内のすべての呼び出しは、特に注記がない限り、 対応する OpenGL のものと同一に振る舞う。
blendColor はその引数を 0 から 1 の範囲にクランプする。
depth 値は 0 から 1 の範囲にクランプされる。
zNear および zFar の値は 0 から 1 の範囲にクランプされ、
zNear は zFar 以下でなければならない。
ビューポート深度範囲を参照。
| 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 を返す。
pname が IMPLEMENTATION_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 実装で利用可能な拡張を問い合わせることに関する情報については、 拡張の問い合わせを参照。
CONTEXT_LOST_WEBGL を返す。その後は、コンテキストが
復元されるまで NO_ERROR を返す。
isEnabled 問い合わせについて、同じ boolean 値は
getParameter によって取得できる。
UNPACK_FLIP_Y_WEBGL、
UNPACK_PREMULTIPLY_ALPHA_WEBGL
および UNPACK_COLORSPACE_CONVERSION_WEBGL パラメーターを受け入れる。
これらのパラメーターの説明については、
ピクセルストレージパラメーターを参照。
描画コマンドは、現在バインドされている framebuffer 内のピクセルのみを変更できる。 加えて、viewport および scissor box は描画に影響する。
viewport は、正規化デバイス座標からウィンドウ座標への x および y の
アフィン変換を指定する。viewport のサイズは、
WebGL ビューポートの節で指定されるように初期決定される。
scissor box は、描画を制約する矩形を定義する。scissor test が有効な場合、
clear を含む描画コマンドによって変更できるのは scissor box 内にある
ピクセルのみであり、プリミティブは viewport、現在バインドされている framebuffer、
および scissor box の交差部分の内側でのみ描画できる。scissor test が有効でない場合、
プリミティブは viewport と現在バインドされている framebuffer の交差部分の内側でのみ
描画できる。
Buffer オブジェクト(VBO と呼ばれることもある)は、GLSL shader のための頂点属性データを 保持する。
buffer がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。INVALID_OPERATION エラーが
生成され、現在のバインディングは変更されない。
削除対象としてマークされたオブジェクトをバインドしようとすると、
INVALID_OPERATION エラーが生成され、現在のバインディングは変更されない。
INVALID_VALUE エラーが生成される。
void bufferSubData(GLenum target, GLintptr offset, AllowSharedBufferSource data) (OpenGL ES 2.0 §2.9、man ページ)
INVALID_VALUE エラーが生成される。data が null の場合、
INVALID_VALUE エラーが生成される。
buffer がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。| pname | 返される型 |
|---|---|
| BUFFER_SIZE | GLint |
| BUFFER_USAGE | GLenum |
pname が上の表にない場合、INVALID_ENUM エラーを生成する。
OpenGL エラーが生成された場合、null を返す。
WebGLRenderingContext によって
生成された場合、false を返す。Framebuffer オブジェクトは、描画バッファに代わるレンダリングターゲットを提供する。 それらは color、alpha、depth および stencil buffer の集合であり、後でテクスチャとして 使用される画像をレンダリングするためによく使用される。
framebuffer がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。WebGLFramebuffer オブジェクトを、指定された
バインディングポイント(target)へバインドする。
これは FRAMEBUFFER でなければならない。
framebuffer が null の場合、コンテキストによって提供される
デフォルト framebuffer がバインドされ、target
FRAMEBUFFER 上の状態を変更または問い合わせようとすると
INVALID_OPERATION エラーが生成される。
削除対象としてマークされたオブジェクトをバインドしようとすると、
INVALID_OPERATION エラーが生成され、現在のバインディングは変更されない。
FRAMEBUFFER_UNSUPPORTED を返す。
framebuffer がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。renderbuffer がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。texture がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。| 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 を返す。
WebGLRenderingContext によって
生成された場合、false を返す。Renderbuffer オブジェクトは、framebuffer オブジェクト内で使用される個々の buffer のための ストレージを提供するために使用される。
renderbuffer がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。WebGLRenderbuffer オブジェクトを、指定された
バインディングポイント(target)へバインドする。
これは RENDERBUFFER でなければならない。
renderbuffer が null の場合、この
target に現在バインドされている renderbuffer オブジェクトは
アンバインドされる。
削除対象としてマークされたオブジェクトをバインドしようとすると、
INVALID_OPERATION エラーが生成され、現在のバインディングは変更されない。
renderbuffer がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。| 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 を返す。
WebGLRenderingContext によって
生成された場合、false を返す。
Texture オブジェクトは、テクスチャリング操作のためのストレージおよび状態を提供する。
WebGLTexture がバインドされていない場合(たとえば bindTexture に null または 0 を渡す場合)、
texture オブジェクトを変更または問い合わせようとすると INVALID_OPERATION エラーが
生成されなければならない。これは以下の関数で示される。
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.3、man ページ)
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.3、man ページ)
INVALID_OPERATION エラーが生成される。INVALID_ENUM エラーを生成し、ただちに
戻る。圧縮テクスチャサポートを参照。
INVALID_OPERATION エラーが生成される。texImage2D が null データで呼び出され、その後
copyTexSubImage2D が呼び出されたかのように振る舞う。
copyTexSubImage2D と同様に、framebuffer の外側にある任意のソースピクセルに
ついて、対応する宛先 texel は変更されないまま残るため、texImage2D が
null データで呼び出されたかのように、それらはゼロ初期化された内容を保持する。
これにより、framebuffer の外側にあるソースピクセルについて、対応する宛先ピクセルでは、
関連する texel のすべてのチャンネルが 0 に初期化されるという複合的な効果がある。
framebuffer の外側のピクセルの読み取りを参照。INVALID_OPERATION エラーが生成される。
INVALID_OPERATION エラーが生成される。INVALID_OPERATION エラーが生成される。
texture がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。INVALID_OPERATION エラーが生成される。
| 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 を返す。
WebGLRenderingContext によって
生成された場合、false を返す。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 エラーが生成される。
INVALID_OPERATION エラーが生成される。pixels が非 null であるが、そのサイズが、指定された
width、height、format、type、および
ピクセルストレージパラメーターによって要求されるものより小さい場合、
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.1、man ページ)
UNPACK_COLORSPACE_CONVERSION_WEBGL
ピクセルストレージパラメーターが NONE に設定されている場合を除き、
unpackColorSpace
属性によって指定される色空間へ概念的に変換される。ImageBitmap オブジェクトにも適用されるが、
他のテクスチャ unpack パラメーターは ImageBitmap には適用されない。
それらは ImageBitmap の構築時に指定されることが期待されるためである。
実装経験により、WebGL テクスチャへアップロードする際に
ImageBitmap の色空間変換を可能な限り遅く行うことが有益であることが
明らかになった。
| ソース 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 固有のピクセルストレージパラメーターについては、
ピクセルストレージパラメーターを参照。ImageBitmap 引数を除き、
UNPACK_FLIP_Y_WEBGL ピクセルストレージ
パラメーターによって変更される。HTMLImageElement または ImageBitmap であり、
8 ビット/チャンネルの RGB または RGBA ロスレス画像を含む場合、ブラウザーはすべての
チャンネルの完全な精度が保持されることを保証する。HTMLImageElement がアルファチャンネルを含み、
UNPACK_PREMULTIPLY_ALPHA_WEBGL ピクセルストレージパラメーターが false の場合、
RGB 値は、元のファイル形式から直接導出されたか、または他の色形式から変換されたかに
かかわらず、アルファチャンネルによってプリマルチプライされていないことが保証される。UNPACK_PREMULTIPLY_ALPHA_WEBGL ピクセルストレージパラメーターを false に
設定して WebGL テクスチャへアップロードされる場合、色チャンネルはアルファチャンネルに
よって非乗算化されなければならず、これは損失を伴う操作である。したがって、
WebGL 実装は、alpha < 1.0 の色が、最初に CanvasRenderingContext2D を介して
canvas へ描画され、その後 UNPACK_PREMULTIPLY_ALPHA_WEBGL
ピクセルストレージパラメーターを false に設定して WebGL テクスチャへアップロードされる
とき、損失なく保持されることを保証できない。
INVALID_OPERATION エラーが生成される。data 属性を neuter された ImageData で呼び出される場合、
INVALID_VALUE エラーが生成される。ImageBitmap で呼び出される場合、
INVALID_VALUE エラーが生成される。HTMLImageElement または HTMLVideoElement で呼び出される場合、
またはビットマップの origin-clean フラグが false に設定された
HTMLCanvasElement、ImageBitmap、または
OffscreenCanvas で呼び出される場合、SECURITY_ERR 例外が
投げられなければならない。オリジン制限を参照。source が null の場合、INVALID_VALUE エラーが生成される。INVALID_OPERATION エラーが生成される。
INVALID_OPERATION エラーが生成される。
INVALID_OPERATION エラーが生成される。INVALID_OPERATION エラーが生成される。pixels が null の場合、INVALID_VALUE エラーが生成される。pixels が非 null であるが、そのサイズが、指定された
width、height、format、type、および
ピクセルストレージパラメーターによって要求されるものより小さい場合、
INVALID_OPERATION エラーを生成する。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.2、man ページ)
ImageBitmap 引数を除き、
UNPACK_FLIP_Y_WEBGL ピクセルストレージ
パラメーターによって変更される。INVALID_OPERATION エラーが生成される。INVALID_OPERATION エラーが生成される。data 属性を neuter された ImageData で呼び出される場合、
INVALID_VALUE エラーが生成される。ImageBitmap で呼び出される場合、
INVALID_VALUE エラーが生成される。HTMLImageElement または HTMLVideoElement で呼び出される場合、
またはビットマップの origin-clean フラグが false に設定された
HTMLCanvasElement、ImageBitmap、
または OffscreenCanvas で呼び出される場合、
SECURITY_ERR 例外が投げられなければならない。
オリジン制限を参照。source が null の場合、INVALID_VALUE エラーが生成される。OpenGL ES 2.0 によるレンダリングには、OpenGL ES のシェーディング言語である GLSL ES で 書かれたshadersの使用が必要である。 Shaders はソース文字列で読み込まれ(shaderSource)、コンパイルされ (compileShader)、program にアタッチされ(attachShader)、それがリンクされ (linkProgram)、その後使用されなければならない(useProgram)。
program または shader のいずれかが、このものとは異なる
WebGLRenderingContext によって生成された場合、
INVALID_OPERATION エラーを生成する。
program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。INVALID_VALUE エラーを生成する。name が GLSL Constructs に従う
予約済み WebGL 接頭辞のいずれかで始まる場合、
INVALID_OPERATION エラーを生成する。shader がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。shader がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。program または shader のいずれかが、このものとは異なる
WebGLRenderingContext によって生成された場合、
INVALID_OPERATION エラーを生成する。
program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。渡された program にアタッチされている shaders のリストを表す新しいオブジェクトを返す。
この関数の実行中に OpenGL エラーが生成された場合、null を返す。
program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。| 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 を返す。
program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。この関数の実行中に OpenGL エラーが生成された場合、null を返す。
shader がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。| pname | 返される型 |
|---|---|
| SHADER_TYPE | GLenum |
| DELETE_STATUS | GLboolean |
| COMPILE_STATUS | GLboolean |
pname が上の表にない場合、INVALID_ENUM エラーを生成し、
null を返す。
この関数の実行中に OpenGL エラーが生成された場合、null を返す。
指定された shader 数値形式の範囲および精度を記述する新しい
WebGLShaderPrecisionFormat を返す。shadertype 値は FRAGMENT_SHADER または
VERTEX_SHADER であり得る。precisiontype 値は LOW_FLOAT、MEDIUM_FLOAT、HIGH_FLOAT、
LOW_INT、MEDIUM_INT または HIGH_INT であり得る。
この関数の実行中に OpenGL エラーが生成された場合、null を返す。
shader がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。この関数の実行中に OpenGL エラーが生成された場合、null を返す。
shader がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。この関数の実行中に OpenGL エラーが生成された場合、null を返す。
WebGLRenderingContext によって
生成された場合、false を返す。WebGLRenderingContext によって
生成された場合、false を返す。program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。useProgram によって使用中の
現在の program オブジェクトでもある場合、次のとおりである。
INVALID_OPERATION エラーを生成する。
リンク失敗時に現在の program が無効化されるを参照。
shader がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。shaders によって使用される値は、uniforms または vertex attributes として渡される。
index の vertex attribute を array として有効化する。WebGL は、有効化された
vertex attributes に関して OpenGL ES 2.0 を超える追加の規則を課す。
有効化された Vertex Attributes と範囲
チェックを参照。
program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。WebGLActiveInfo オブジェクトを返す。
渡された index が範囲外の場合、INVALID_VALUE エラーを生成し、null を返す。
この関数の実行中に OpenGL エラーが生成された場合、null を返す。
program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成する。WebGLActiveInfo オブジェクトを返す。渡された index が
範囲外の場合、INVALID_VALUE エラーを生成し、null を返す。
この関数の実行中に OpenGL エラーが生成された場合、null を返す。
program の
invalidated flag が設定されている場合、
INVALID_OPERATION エラーを生成し、-1 を返す。program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成し、-1 を返す。program が削除されている場合、
INVALID_VALUE エラーを生成し、-1 を返す。program がリンクされていない場合、
INVALID_OPERATION エラーを生成し、-1 を返す。name が
Uniform および Attribute Location の最大長で定義される
制限より長い場合、INVALID_VALUE エラーを生成し、-1 を返す。name が
GLSL ソース文字集合の外側の文字を含む場合、
INVALID_VALUE エラーを生成し、-1 を返す。name が GLSL Constructs に従う
予約済み WebGL 接頭辞のいずれかで始まり、かつ上で記述されたエラー条件のいずれも
適用されない場合、エラーを生成せず -1 を返す。
program または location のいずれかが、このものとは異なる
WebGLRenderingContext によって生成された場合、
INVALID_OPERATION エラーを生成する。| 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 を返す。
program がこのものとは異なる WebGLRenderingContext によって
生成された場合、INVALID_OPERATION エラーを生成し、null を返す。program が削除されている場合、
INVALID_VALUE エラーを生成し、null を返す。program がリンクされていない場合、
INVALID_OPERATION エラーを生成し、null を返す。name が
Uniform および Attribute Location の最大長で定義される
制限より長い場合、INVALID_VALUE エラーを生成し、null を返す。name が
GLSL ソース文字集合の外側の文字を含む場合、
INVALID_VALUE エラーを生成し、null を返す。name が GLSL Constructs に従う
予約済み WebGL 接頭辞のいずれかで始まり、かつ上で記述されたエラー条件のいずれも
適用されない場合、エラーを生成せず null を返す。WebGLUniformLocation を返す。name が渡された program 内の
active uniform 変数に対応しない場合、戻り値は null である。
| 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 を返す。
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.4、man ページ)
location が null でなく、かつ現在使用中の program から以前の
getUniformLocation 呼び出しによって取得されたものでない場合、
INVALID_OPERATION エラーが生成される。渡された
location が null の場合、渡されたデータは黙って無視され、uniform 変数は
変更されない。
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.7、man ページ)
vertexAttrib によって設定された値は、途中に drawArrays または
drawElements の呼び出しがあった場合でも、CURRENT_VERTEX_ATTRIB
param を指定した getVertexAttrib 関数から返されることが保証される。
v で終わるもの)のいずれかに渡された array が短すぎる場合、
INVALID_VALUE エラーが生成される。
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 における追加により)これらに限定されない。
cleardrawArraysdrawElementsdrawArraysInstancedANGLE を追加し、
WebGL 2.0
は drawArraysInstanced を追加する。
これらの呼び出しのいずれかが、complete framebuffer の欠落した attachment へ描画しようとした場合、 欠落した Attachment への描画に従い、 その attachment には何も描画されず、エラーも生成されない。
INVALID_VALUE エラーが生成される。
CURRENT_PROGRAM が null の場合、INVALID_OPERATION エラーが生成される。
INVALID_OPERATION エラーが生成される。加えて、offset は非負でなければならず、
そうでない場合 INVALID_VALUE エラーが生成される。
Buffer Offset および Stride の要件を参照。count が 0 より大きい場合、
非 null の WebGLBuffer が ELEMENT_ARRAY_BUFFER バインディングポイントに
バインドされていなければならず、そうでない場合 INVALID_OPERATION エラーが
生成される。INVALID_OPERATION エラーが生成される。
drawArrays および drawElements の呼び出し中に、
OpenGL ES 2.0 で指定されるものを超える追加のエラーチェックを実行する。
有効化された Vertex Attributes と範囲チェックを参照。
OpenGL ES 2.0 には、現在バインドされている(read)framebuffer から読み取ることが 許可される複数の呼び出しがある。 WebGL はそのようなすべての呼び出しを [読み取り操作]として分類する。
これらには次が含まれるが、(拡張または WebGL 2.0 における追加により)これらに限定されない。
copyTexImage2DcopyTexSubImage2DreadPixelspixels を満たす。
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 エラーが生成される。
format と type の組み合わせは 2 つのみ受け入れられる。
1 つ目は format RGBA および type UNSIGNED_BYTE である。
2 つ目は実装が選択する形式である。この形式の format および type の値は、
記号定数 IMPLEMENTATION_COLOR_READ_FORMAT および IMPLEMENTATION_COLOR_READ_TYPE をそれぞれ用いて
getParameter を呼び出すことによって決定できる。
実装が選択する形式は、現在バインドされているレンダリングサーフェスの形式に応じて変わる場合がある。
format と type のサポートされない組み合わせは、
INVALID_OPERATION エラーを生成する。
readPixels に与えても、必ずしも INVALID_ENUM が生成されるとは
限らない。
pixels が null の場合、INVALID_VALUE エラーが生成される。
pixels が非 null であっても、pixel store modes を考慮して指定された矩形内の
すべてのピクセルを取得するのに十分な大きさでない場合、INVALID_OPERATION エラーが生成される。
INVALID_OPERATION エラーが生成される。
モバイルデバイス上の電源イベントなどの発生により、WebGL レンダリングコンテキストは いつでも喪失し、アプリケーションにそれを再構築することを要求する可能性がある。 詳細については WebGLContextEvent を参照。 次のメソッドはコンテキスト喪失イベントの検出を支援する。
WebGL の実装は、拡張機構を通じてその機能を最初に有効化することなく、
追加のパラメーター、定数、または関数をサポートしてはならない。
getSupportedExtensions 関数は、この実装がサポートする拡張文字列の配列を返す。
拡張は、それらの文字列の 1 つを getExtension 関数へ渡すことで有効化される。
この呼び出しは、その拡張によって定義される任意の定数または関数を含むオブジェクトを返す。
そのオブジェクトの定義は拡張固有であり、拡張仕様によって定義されなければならない。
拡張が有効化されると、それは WebGL レンダリングコンテキストが喪失した場合にのみ無効化される
(下を参照)。ただし、"WEBGL_lose_context" 拡張は例外で、任意のコンテキスト喪失を通じて
アクティブなままである。getExtension によって返されるオブジェクトなど、
無効化された拡張によって参照される任意のオブジェクトは、もはや WebGL レンダリングコンテキストに
関連付けられていない。WebGLObject から派生する任意の拡張オブジェクトは、その
invalidated フラグが true に設定される。
コンテキスト喪失後の拡張のメソッドの振る舞いは、
"WebGL コンテキスト"の節の手順によって定義される。
拡張を無効化する他の機構はない。
同じ拡張文字列での getExtension の複数回の呼び出しは、大文字小文字を区別しない
比較を考慮したうえで、拡張が有効である限り同じオブジェクトを返さなければならない。
getExtension を最初に呼び出して有効化することなく拡張の任意の機能を使用しようとする試みは、
適切な GL エラーを生成しなければならず、その機能を使用してはならない。
この仕様は拡張を定義しない。別個の WebGL 拡張レジストリが、特定の WebGL 実装によって サポートされ得る拡張を定義する。
getSupportedExtensions から返された名前の 1 つに対して
ASCII
大文字小文字不区別一致 [HTML] である場合、かつその場合に限り、
オブジェクトを返す。そうでなければ null を返す。
getExtension から返されるオブジェクトは、その拡張によって提供される任意の定数または
関数を含む。拡張が何も定義しない場合、返されるオブジェクトは定数や関数を持たないことがあるが、
それでも一意のオブジェクトが返されなければならない。そのオブジェクトは、拡張が有効化されたことを
示すために使用される。
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 が喪失したことを検出した場合、次の手順を実行しなければならない。
WebGLObject インスタンスの
invalidated flag を設定する。
statusMessage 属性を "" に設定して、
"webglcontextlost" という名前の
WebGL context event を発火する。
コンテキストが喪失している間に作成された WebGLObject
(たとえば createBuffer() による WebGLBuffer)は、
その invalidated flag が設定された状態で
生存を開始する。
webglcontextlost イベントのデフォルトの振る舞いを防ぎ、
webglcontextrestored イベントが配信されるようにする。
canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false);
ユーザーエージェントが WebGLRenderingContext context のために
drawing
buffer を復元することになっている場合、次の手順を実行しなければならない。
statusMessage 属性を "" に設定して、
"webglcontextrestored" という名前の
WebGL context event を発火する。
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 を発火することになっている場合、次の手順を実行しなければならない。
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);
}
この節では、さまざまなオペレーティングシステムおよびデバイス間での移植性を向上させるために、 OpenGL ES 2.0 API に対して WebGL API に加えられた変更について記述する。
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 オブジェクトがバインドされていなければならない。
コンパイル済み shaders のバイナリ表現へのアクセスは、WebGL API ではサポートされない。
これには OpenGL ES 2.0 の ShaderBinary エントリポイントが含まれる。
加えて、getParameter を介して shader バイナリ形式および shader compiler の
利用可能性を問い合わせることは、WebGL API ではサポートされない。
すべての WebGL 実装は、オンライン shader compiler を暗黙にサポートしなければならない。
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 エラーが生成される。
active vertex attribute のためのデータのフェッチを必要とする drawing コマンドを呼び出すことで、
draw コマンドが WebGLBuffer の境界外のデータを要求する可能性がある。
これは、その attribute が array として有効化されているときに、直接(drawArrays)、
または indexed draw(drawElements)から間接的に起こる。
これが発生した場合、次の振る舞いのいずれかになる。
vertex attribute が array として有効化され、その attribute に buffer がバインドされているが、
その attribute が現在の program によって消費されない場合、バインドされた buffer のサイズに
かかわらず、drawArrays または drawElements の呼び出し中に
エラーは生成されない。
ELEMENT_ARRAY_BUFFER の境界外にある index 要素をフェッチする indexed drawing コマンド
(drawElements)を呼び出すと、INVALID_OPERATION エラーになる。
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 を同時にアタッチすることは エラーである。
DEPTH_ATTACHMENT + DEPTH_STENCIL_ATTACHMENT
STENCIL_ATTACHMENT + DEPTH_STENCIL_ATTACHMENT
DEPTH_ATTACHMENT + STENCIL_ATTACHMENT
checkFramebufferStatus は FRAMEBUFFER_UNSUPPORTED を返さなければならない。
INVALID_FRAMEBUFFER_OPERATION エラーを生成し、framebuffer、宛先 texture、または
宛先メモリの内容を変更しないまま早期に戻らなければならない。
COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTE texture
COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTE texture + DEPTH_ATTACHMENT =
DEPTH_COMPONENT16 renderbuffer
COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTE texture +
DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL renderbuffer
width および height パラメーターが明示的に指定されない限り、
texImage2D によって設定される texture の width と height、および
texSubImage2D によって更新される部分矩形の width と height は、
アップロードされる TexImageSource source オブジェクトに基づいて決定される。
ImageData 型の source
ImageData オブジェクトの実際のピクセル width と height を表す。
HTMLImageElement 型の source
HTMLImageElement オブジェクトの width および height
プロパティの現在値に設定される。
HTMLCanvasElement または
OffscreenCanvas 型の source
HTMLCanvasElement または
OffscreenCanvas オブジェクトの width および height プロパティの現在値に設定される。
HTMLVideoElement または VideoFrame[WEBCODECS] 型の
source
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 である。
TexImageSource が ImageBitmap である場合、これら 3 つのパラメーターは
無視される。代わりに、目的の形式を持つ ImageBitmap を作成するために、
同等の
ImageBitmapOptions
が使用されるべきである。
[読み取り操作] について、 範囲外ピクセルの sub-areas からの読み取りは、対応する宛先 sub-areas に触れない。
WebGL はリソースをゼロで事前初期化する(かのように振る舞う)。
したがって、たとえば copyTexImage2D では、範囲外 framebuffer 読み取りに
対応する sub-areas にゼロが入る。
WebGL API では、stencil testing が有効で、現在バインドされている framebuffer に stencil buffer が
ある場合、次のいずれかの条件が真である間に描画することは不正である。
そうすると INVALID_OPERATION エラーが生成される。
(STENCIL_WRITEMASK & maxStencilValue) != (STENCIL_BACK_WRITEMASK & maxStencilValue)
face の FRONT および BACK 値にそれぞれ関連付けられた mask
パラメーターに対して、stencilMaskSeparate によって指定される)
(STENCIL_VALUE_MASK & maxStencilValue) != (STENCIL_BACK_VALUE_MASK & maxStencilValue)
face の FRONT および BACK 値にそれぞれ関連付けられた mask
パラメーターに対して、stencilFuncSeparate によって指定される)
clamp(STENCIL_REF, 0, maxStencilValue) != clamp(STENCIL_BACK_REF, 0, maxStencilValue)
face の FRONT および BACK 値にそれぞれ関連付けられた ref
パラメーターに対して、stencilFuncSeparate によって指定される)
ここで maxStencilValue は ((1 << s) - 1) であり、
s は draw framebuffer 内の stencil bits の数である。
(stencil bits が存在しない場合、これらのチェックは常に通る。)
WebGL API は、255 バイトまでの vertex attribute data strides をサポートする。
stride パラメーターの値が 255 を超える場合、vertexAttribPointer の呼び出しは
INVALID_VALUE エラーを生成する。
WebGL API は、near plane が far plane の値より大きい値へマップされる depth ranges を
サポートしない。zNear が zFar より大きい場合、
depthRange の呼び出しは INVALID_OPERATION エラーを生成する。
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 エラーを生成する。
srcRGB が CONSTANT_COLOR または
ONE_MINUS_CONSTANT_COLOR に設定され、dstRGB が
CONSTANT_ALPHA または ONE_MINUS_CONSTANT_ALPHA に設定されている場合、
またはその逆の場合、blendFuncSeparate の呼び出しは
INVALID_OPERATION エラーを生成する。
GL_FIXED データ型をサポートしない。
サポートされる GLSL Constructs に従い、 "webgl_" および "_webgl_" で始まる identifiers は WebGL による使用のために予約される。
OpenGL ES 2.0 API では、利用可能な拡張は glGetString(GL_EXTENSIONS) を呼び出すことで
決定され、これはスペース区切りの拡張文字列のリストを返す。
WebGL API では、EXTENSIONS enumerant は削除されている。
代わりに、利用可能な拡張の集合を決定するために getSupportedExtensions が
呼び出されなければならない。
中核 WebGL 仕様は、サポートされる圧縮テクスチャ形式を定義しない。 したがって、他の拡張が有効化されていない場合、
compressedTexImage2D
および compressedTexSubImage2D メソッドは
INVALID_ENUM エラーを生成する。
getParameter を
COMPRESSED_TEXTURE_FORMATS 引数で呼び出すと、
(Uint32Array 型の)長さ 0 の配列を返す。
WebGL 実装は、非圧縮形式よりも効率的な圧縮テクスチャ形式のみを公開すべきである。
GLSL ES 仕様 [GLES20GLSL] は、トークンの長さに制限を定義していない。 WebGL は 256 文字までの長さのトークンをサポートすることを要求する。256 文字より長いトークンを 含む shaders はコンパイルに失敗しなければならない。
WebGL は、任意の HTML DOMString [DOMSTRING] を
shaderSource へエラーなしで渡すことをサポートする。
ただし shader コンパイル中、GLSL preprocessing およびコメント除去の後、残るすべての文字は
[GLES20GLSL] の文字集合内になければならない。
そうでなければ、shader はコンパイルに失敗しなければならない。
特に、これは次を許可する。
// 你好
#ifdef __cplusplus #line 42 "foo.glsl" #endif(二重引用符文字は GLSL 文字集合の外側にあるが、preprocessing によって除去されるため、 shader sources 内で許可される)
GLSL ES 仕様 [GLES20GLSL] は、OpenGL ES shading language の ソース文字集合を ISO/IEC 646:1991 の部分集合として定義しており、これは一般に ASCII [ASCII] と呼ばれる。 一部の GLSL 実装は、コメント内であっても ASCII 範囲外の任意の文字を許可しない。 ブラウザーは完全な DOMString 文字集合の preprocessing を正しく処理しなければならない一方で、 WebGL 実装は一般に、安全のため GLSL driver へ送られる shader source が ASCII のみを 含むことを保証しなければならない。 実装は、必要に応じて空行を挿入するなどして、デバッグ目的で行番号を保持すべきである。
この集合に含まれない文字を含む文字列が、他の shader 関連エントリポイント
bindAttribLocation、
getAttribLocation、
または getUniformLocation のいずれかへ渡された場合、
INVALID_VALUE エラーが生成される。
WebGL は、GLSL shaders における構造体のネストに制限を課す。ネストは、struct 内の field が 別の struct 型を参照するときに発生する。GLSL ES 仕様 [GLES20GLSL] は埋め込み構造体定義を禁止する。 top-level struct 定義内の fields はネストレベル 1 を持つ。
WebGL は、構造体ネストレベル 4 のサポートを要求する。4 レベルより深くネストされた構造体を 含む shaders はコンパイルに失敗しなければならない。
WebGL は、uniform および attribute locations の長さに 256 文字の制限を課す。
WebGL API では、INFO_LOG_LENGTH、SHADER_SOURCE_LENGTH、
ACTIVE_UNIFORM_MAX_LENGTH、および ACTIVE_ATTRIBUTE_MAX_LENGTH enumerants は
削除されている。OpenGL ES 2.0 API では、これらの enumerants は glGetActiveAttrib
などの呼び出しへ渡される buffer のサイズを決定するために必要である。
WebGL API では、類似する呼び出し(getActiveAttrib、
getActiveUniform、getProgramInfoLog、getShaderInfoLog、
および getShaderSource)はすべて DOMString を返す。
WebGL API では、texSubImage2D へ渡される type 引数は、
texture オブジェクトを最初に定義するために使用された型(すなわち texImage2D を使用)と
一致しなければならない。
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 の数は 次の方法で決定される。
getParameter(MAX_VERTEX_UNIFORM_VECTORS)
getParameter(MAX_FRAGMENT_UNIFORM_VECTORS)
getParameter(MAX_VARYING_VECTORS)
上記のテキストは、パッキングアルゴリズムによって強制される制約により shader または program のコンパイルまたはリンクが失敗しなければならない状況を定義する。 このアルゴリズムに従って変数が正常にパックされる、最小要求量より多くの変数を使用する shader が正常にコンパイルされることは保証されない。 scalar arrays が複数の columns を消費するように展開されることを含め、実装における非効率が 観察されている。開発者は、複数の変数を columns へ自動的にパックすることに大きく依存するのを 避けるべきである。代わりに、より大きな変数(vec4 など)を定義し、値を右端の columns へ 明示的にパックすること。
OpenGL ES 2.0 API では、同じ texture に対して書き込みと読み取りの両方を行う呼び出しを作成し、 フィードバックループを作ることが可能である。 そのようなフィードバックループが存在する場合、未定義の振る舞いになると指定されている。
WebGL API では、(OpenGL ES 2.0 仕様内の定義によって)そのようなフィードバックループを
引き起こす操作は、代わりに INVALID_OPERATION エラーを生成する。
OpenGL ES 2.0 API では、color attachment を持たない complete framebuffer から color data の ReadPixels を行うなど、コマンドが欠落した attachment からデータを取得しようとすると何が起こるかは 指定されていない。
WebGL API では、欠落している attachment からのデータを必要とする任意の
[読み取り操作] は、
INVALID_OPERATION エラーを生成する。
OpenGL ES 2.0 API では、color attachment を持たない complete framebuffer から draw buffer を クリアするなど、コマンドが欠落した attachment へ描画しようとすると何が起こるかは 指定されていない。
WebGL API では、欠落している attachment へ描画する任意の [描画操作] は、その attachment へは何も描画しない。 エラーは生成されない。
WebGL API では、lineWidth へ渡される width パラメーターが
NaN に設定されている場合、INVALID_VALUE エラーが生成され、line width は変更されない。
アプリケーションが複数の attribute 名を同じ location へバインドすることは可能である。
これは aliasing と呼ばれる。同じ location へ alias された複数の attributes が実行可能 program 内で
active である場合、linkProgram は失敗すべきである。
GLSL ES [GLES20GLSL] 仕様は、vertex shader 内で書き込まれない限り、
gl_Position の値を未定義のままにしている。WebGL は、gl_Position の初期値が
(0,0,0,0) であることを保証する。
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 は警告を生成すべきである。
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 にならなければならない。
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 実装も同様であるため、既存コンテンツとの互換性を保ちながら
仕様を明確に定義する唯一の方法は、その規則を緩和することである。
WebGL API では、cube complete でない cube map の面は framebuffer attachment complete ではない。
incomplete cube map の面がアタッチされているときに framebuffer status を問い合わせると、
FRAMEBUFFER_INCOMPLETE_ATTACHMENT を返さなければならない。
vertices を GL へ転送する任意のコマンドは、CURRENT_PROGRAM が null である場合、
INVALID_OPERATION を生成する。これには drawElements および
drawArrays が含まれる。
fragment shader が gl_FragColor にも gl_FragData にも書き込まない場合、
shader 実行後の fragment colors の値は変更されない。
GLSL ES [GLES20GLSL] 仕様は、local および global 変数の値を、
shader によって初期化されない限り未定義のままにしている。WebGL は、そのような変数がゼロに
初期化されることを保証する:
0.0、vec4(0.0)、0、false など。
OpenGL ES 2.0 仕様 [GLES20] section 2.1.2 "Data Conversions", subsection "Conversion from Integer to Floating-Point" は、正規化された符号付き整数 c (その型の bit width が b)から浮動小数点値 f への変換を次のように定義する。
WebGL program にアタッチされた shaders のいずれかが、静的に使用される vertex attribute と同じ名前の uniform を宣言する場合、program linking は失敗すべきである。
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.
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 が保持されるというものである。この振る舞いをすべてのシナリオで正しく実装することは 困難であり、セキュリティバグにつながってきた。
shaders 内の identifiers は、たとえば "g__Foo" のように、double-underscores を含んでもよい。
この仕様は 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.