WebGL 2シリーズのWebGL 1からWebGL 2への移行
4664 ワード
WebGL 2はWebGL 1とほぼ100%互換性がありますが、ここで言うのはほとんど、つまり、わずかな違いがあるので、もともとWebGL 1のコードがWebGL 2に移行しても、あまり困難にぶつかることはないはずです.ただし、WebGL 2とWebGL 1には2つの主な違いがありますので、以下を参照してください.
WebGL 2コンテキストの取得
WEB 2とWebGL 1のコンテキストを取得する方法は完全に一致していない.はcanvasのgetContextメソッドによってWebGL 2のコンテキストを取得し、これはWebGL 1と一致する である. getContextメソッドが入力パラメータは「webgl 2」であり、「webgl」ではない.
以下、WEB 2コンテキストを取得するコード
WebGL 2はすべてのブラウザでサポートされているわけではないので、WebGL 2コンテキストが存在しない場合は、WebGL 1をロールバックして使用すると判断し、コードは以下の通りです.
多くのWebGL拡張はWebGL 2で直接使用できます
WebGL 1には、多くの拡張機能があり、WebGL 1でこれらの機能を使用するには、まず拡張をロードして呼び出す必要がありますが、WebGL 2では、WebGL 1の多くの拡張機能が直接使用できます.たとえば、頂点配列オブジェクト(Vertex Array Object)は、WebGL 1では拡張オブジェクトOES_vertex_array_objectは、WebGL 2で直接使用します.WebGL 1では、次のようにコードを使用します.
WebGL 2では、コードは次のとおりです.
VAOの関連機能については、後章でご紹介します.
上記の2点を除いて、webgl 1の他の機能は、WebGL 2とよく互換性があります.
例えば、いくつかのWebGL 2の高度な特性を使用するためには、いくつかの変更が必要です.
GLSL 300 esの使用
WebGL 2のシェーダ言語は、本来のWebGL 1のGLSL 100をサポートするとともにGLSL 300 esもサポートするが、より高度な特性を使用するにはGLSL 300 esを使用する必要がある.GLSL 300 esを使ったいくつかのバリエーションを以下にご紹介します.
指定したシェーダ言語バージョンを表示
GLSL 300 esを使用するには、シェーダコードに表示される宣言が必要です.宣言バージョンコードは次のとおりです.
次の点に注意してください.
バージョンで宣言されたコードは、頂点シェーダとシェーダで同時に を指定する必要があります.バージョンで宣言されたコードは、第1行 で厳格にしなければならない.
前述の厳密な第1行は、宣言の前に空行や注釈であっても何の行も存在しないことを意味し、以下はコードによって説明する.例えば、version 300 esの前に空行があるため、次のコードは間違っている.
正しいコードは次のとおりです.
たとえば、次のコードはエラーです.
正しいコードは次のとおりです.
GLSL 300 esの違い
GLSL 300 esとGLSL 100 esにはいくつかの違いがありますが、以下ではこれらの違いを一つ一つ説明します
attributeの代わりにinを使用
GLSL 100では、頂点データの変数を定義し、attributeキーワードを用いて、以下のようにする.
GLSL 300 esではinキーワードを使用し、コードは以下の通りである.
varyingはin/outに置き換えられます
GLSL 100では、頂点シェーダおよびチップシェーダにおいて、varyingキーワードによってvarying変数が宣言され、コードは以下の通りである.
GLSL 300 esでは、頂点シェーダのvarying変数はoutで宣言され、出力を表します.
シェーダのvarying変数はinで宣言され、次のようになります.
GLSL 300 esには内蔵変数gl_がありませんFragColor
GLSL 100では、内蔵変数gl_をFragColorは、チップの出力色を設定するために値を割り当てます.コードは次のとおりです.
GLSL 300 esでは、出力色の変数を自分で定義し、main関数に色値を設定する必要があります.コードは以下の通りです.
ここでは変数名を入力して勝手に定義できますがgl_は使用できません開通しているので、out vec 4 glをこのように定義することはできません.FragColor;
texture 2 D、texture Cubeの代わりにtextureを使用
GLSL 100では、texture 2 D法により2 Dマップの画素を取得し、texture Cube法により立方体マップの画素を取得する.
GLSL 300 esではtextureメソッドを使用するだけでよいが、変更方法は入力されたマップオブジェクトを通じて自動的に判断され、コードは以下の通りである.
まとめ
前述したWebGL 1からWebGL 2への移行の主な違いとGLSL 300 esを用いたGLSL 100との違いを挙げると、WEB 2はWebGL 1と完全に互換性がないものの、互換性がない点が多くないため、移行の難易度は大きくないことがわかる.後述の章では、WebGL 2に関する特性を続々と紹介します.
公衆番号へようこそ:ITman彪おじさん
WebGL 2コンテキストの取得
WEB 2とWebGL 1のコンテキストを取得する方法は完全に一致していない.
以下、WEB 2コンテキストを取得するコード
var canvas = document.createElement('canvas');
var gl2 = canvas.getContext('webgl2');
WebGL 2はすべてのブラウザでサポートされているわけではないので、WebGL 2コンテキストが存在しない場合は、WebGL 1をロールバックして使用すると判断し、コードは以下の通りです.
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl2');
var isWebGL2 = true;
if (!gl) { // try to fallback to webgl 1
gl = canvas.getContext('webgl') ||
canvas.getContext('experimental-webgl');
isWebGL2 = false;
}
if (!gl) {
console.log('your browser does not support WebGL');
}
多くのWebGL拡張はWebGL 2で直接使用できます
WebGL 1には、多くの拡張機能があり、WebGL 1でこれらの機能を使用するには、まず拡張をロードして呼び出す必要がありますが、WebGL 2では、WebGL 1の多くの拡張機能が直接使用できます.たとえば、頂点配列オブジェクト(Vertex Array Object)は、WebGL 1では拡張オブジェクトOES_vertex_array_objectは、WebGL 2で直接使用します.WebGL 1では、次のようにコードを使用します.
var ext = gl.getExtension("OES_vertex_array_object");
if (!ext) {
//
// tell user they don't have the required extension or work around it
} else {
var aVAO = ext.createVertexArrayOES();
}
WebGL 2では、コードは次のとおりです.
var aVAO = gl.createVertexArray();
VAOの関連機能については、後章でご紹介します.
上記の2点を除いて、webgl 1の他の機能は、WebGL 2とよく互換性があります.
例えば、いくつかのWebGL 2の高度な特性を使用するためには、いくつかの変更が必要です.
GLSL 300 esの使用
WebGL 2のシェーダ言語は、本来のWebGL 1のGLSL 100をサポートするとともにGLSL 300 esもサポートするが、より高度な特性を使用するにはGLSL 300 esを使用する必要がある.GLSL 300 esを使ったいくつかのバリエーションを以下にご紹介します.
指定したシェーダ言語バージョンを表示
GLSL 300 esを使用するには、シェーダコードに表示される宣言が必要です.宣言バージョンコードは次のとおりです.
#version 300 es
次の点に注意してください.
バージョン
前述の厳密な第1行は、宣言の前に空行や注釈であっても何の行も存在しないことを意味し、以下はコードによって説明する.例えば、version 300 esの前に空行があるため、次のコードは間違っている.
var vsSource = `
#version 300 es
`;
正しいコードは次のとおりです.
var vsSource = `#version 300 es
`;
たとえば、次のコードはエラーです.
#version 300 es
...
正しいコードは次のとおりです.
#version 300 es
...
GLSL 300 esの違い
GLSL 300 esとGLSL 100 esにはいくつかの違いがありますが、以下ではこれらの違いを一つ一つ説明します
attributeの代わりにinを使用
GLSL 100では、頂点データの変数を定義し、attributeキーワードを用いて、以下のようにする.
attribute vec4 aPosition;
attribute vec2 aTexcoord;
attribute vec3 aNormal;
GLSL 300 esではinキーワードを使用し、コードは以下の通りである.
in vec4 aPosition;
in vec2 aTexcoord;
in vec3 aNormal;
varyingはin/outに置き換えられます
GLSL 100では、頂点シェーダおよびチップシェーダにおいて、varyingキーワードによってvarying変数が宣言され、コードは以下の通りである.
varying vec2 vTexcoord;
varying vec3 vNormal;
GLSL 300 esでは、頂点シェーダのvarying変数はoutで宣言され、出力を表します.
out vec2 vTexcoord;
out vec3 vNormal;
シェーダのvarying変数はinで宣言され、次のようになります.
in vec2 vTexcoord;
in vec3 vNormal;
GLSL 300 esには内蔵変数gl_がありませんFragColor
GLSL 100では、内蔵変数gl_をFragColorは、チップの出力色を設定するために値を割り当てます.コードは次のとおりです.
gl_FragColor = vec4(1,1,1, 1); // white
GLSL 300 esでは、出力色の変数を自分で定義し、main関数に色値を設定する必要があります.コードは以下の通りです.
out vec4 myOutputColor;
......
void main() {
myOutputColor = vec4(1, 1, 1, 1); // white
}
ここでは変数名を入力して勝手に定義できますがgl_は使用できません開通しているので、out vec 4 glをこのように定義することはできません.FragColor;
texture 2 D、texture Cubeの代わりにtextureを使用
GLSL 100では、texture 2 D法により2 Dマップの画素を取得し、texture Cube法により立方体マップの画素を取得する.
uniform sampler2D uTexture;
uniform samplerCube uCubeTexture;
......
void main(){
vec4 color1 = texture2D(uTexture, ...);
vec4 color2 = textureCube(uCubeTexture, ...);
}
GLSL 300 esではtextureメソッドを使用するだけでよいが、変更方法は入力されたマップオブジェクトを通じて自動的に判断され、コードは以下の通りである.
uniform sampler2D uTexture;
uniform samplerCube uCubeTexture;
......
void main(){
vec4 color1 = texture(uTexture, ...);
vec4 color2 = texture(uCubeTexture, ...);
}
まとめ
前述したWebGL 1からWebGL 2への移行の主な違いとGLSL 300 esを用いたGLSL 100との違いを挙げると、WEB 2はWebGL 1と完全に互換性がないものの、互換性がない点が多くないため、移行の難易度は大きくないことがわかる.後述の章では、WebGL 2に関する特性を続々と紹介します.
公衆番号へようこそ:ITman彪おじさん