提示コードの最下部のwindow.onload ですがなぜc++のopenGLと違って無限ループする構造に出来ない。しないのでしょうか?
参考Github : https://github.com/mdn/webgl-examples/tree/gh-pages/tutorial/sample2
js
1 2// 3// エントリーポイント 4// 5function main() { 6 const canvas = document.querySelector('#glcanvas'); 7 const gl = canvas.getContext('webgl'); 8 9 10 //webGLコンテキストの作成に失敗した時 11 if (!gl) { 12 alert("webGLコンテキストの作成失敗"); 13 return; 14 } 15//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 // 頂点シェーダーコード 17 const vsSource = ` 18 attribute vec4 aVertexPosition; 19 20 uniform mat4 uModelViewMatrix; 21 uniform mat4 uProjectionMatrix; 22 23 void main() { 24 gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition; 25 } 26 `; 27 28 // フラグメントシェーダー 29 const fsSource = ` 30 void main() { 31 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 32 } 33 `; 34//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 35 //シェーダープログラムを作成 36 const shaderProgram = initShaderProgram(gl, vsSource, fsSource); 37 38 39 const programInfo = { 40 program: shaderProgram, 41 attribLocations: { 42 vertexPosition: gl.getAttribLocation(shaderProgram, 'aVertexPosition'), 43 }, 44 45 uniformLocations: { 46 projectionMatrix: gl.getUniformLocation(shaderProgram, 'uProjectionMatrix'), 47 modelViewMatrix: gl.getUniformLocation(shaderProgram, 'uModelViewMatrix'), 48 }, 49 }; 50 51 //描画するオブジェクト 52 const buffers = initBuffers(gl); 53 54 // Draw the scene 55 drawScene(gl, programInfo, buffers); 56} 57 58//バッファを初期化 59function initBuffers(gl) 60{ 61 62 // 正方形の位置用のバッファを作成します。 63 const positionBuffer = gl.createBuffer(); 64 65 //バッファを適用 66 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); 67 68 //正方形の頂点の配列 69 const positions = [ 70 1.0, 1.0, 71 -1.0, 1.0, 72 1.0, -1.0, 73 -1.0, -1.0, 74 ]; 75 76 //バッファーオブジェクトのデータストアを初期化 77 gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW); 78 79 return { 80 position: positionBuffer, 81 }; 82} 83 84 85//シーンを描画 86function drawScene(gl, programInfo, buffers) 87{ 88 gl.clearColor(0.0, 0.0, 0.0, 1.0); // カラーバッファを初期化 89 gl.clearDepth(1.0); // 深度バッファを初期化 90 gl.enable(gl.DEPTH_TEST); // 深度テスト 91 gl.depthFunc(gl.LEQUAL); // 深度比較する値を設定 92 93 //キャンバスに描画を開始する前に、キャンバスをクリア 94 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 95 96 97 //パースペクティブマトリックスを作成します 98 const fieldOfView = 45 * Math.PI / 180; // in radians 99 const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight; 100 const zNear = 0.1; 101 const zFar = 100.0; 102 103 //射形行列 104 const projectionMatrix = mat4.create(); 105 mat4.perspective(projectionMatrix,fieldOfView,aspect,zNear,zFar); 106 107 //ビュー行列 108 109 //平行移動 110 let translate = new mat4.create(); 111 mat4.translate(translate,translate,[-0.0, 0.0, -4.0]); 112 113 //回転 114 let rotation = new mat4.create(); 115 mat4.rotate(rotation,rotation,0,[0.0, 0.0, 1.0]); 116 117 //拡大縮小 118 let scale = new mat4.create(); 119 mat4.scale(scale,scale,[1.0,1.0,1.0]); 120 121 122// translate * rotate * scale 123 let modelViewMatrix = new mat4.create(); 124 let rs = new mat4.create(); 125 let trs = new mat4.create(); 126 mat4.multiply(rs,rotation,scale); 127 mat4.multiply(trs,translate,rs); 128 modelViewMatrix = trs; 129 130 131 132 gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position); //バッファーを適用 133 gl.vertexAttribPointer(programInfo.attribLocations.vertexPosition,2,gl.FLOAT,false,0,0); //バッファーの頂点属性を統合 134 gl.enableVertexAttribArray(programInfo.attribLocations.vertexPosition); //バッファーの頂点属性を有効化 135 136 //シェーダーを使う 137 gl.useProgram(programInfo.program); 138 139 // uniform 変数を設定 140 gl.uniformMatrix4fv(programInfo.uniformLocations.projectionMatrix,false,projectionMatrix); 141 gl.uniformMatrix4fv(programInfo.uniformLocations.modelViewMatrix,false,modelViewMatrix); 142 143 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); //描画 144 145 146 147} 148 149//シェーダーを作成 150function initShaderProgram(gl, vsSource, fsSource) 151{ 152 const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource); 153 const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource); 154 155 //シェーダープログラムを作成 156 const shaderProgram = gl.createProgram(); 157 gl.attachShader(shaderProgram, vertexShader); 158 gl.attachShader(shaderProgram, fragmentShader); 159 gl.linkProgram(shaderProgram); 160 161 // もしシェーダープログラムの作成に失敗したら 162 if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { 163 alert('シェーダープログラム作成に失敗: ' + gl.getProgramInfoLog(shaderProgram)); 164 return null; 165 } 166 167 return shaderProgram; 168} 169 170//シェーダーをロード 171function loadShader(gl, type, source) 172{ 173 const shader = gl.createShader(type); 174 175 // ソースをシェーダーオブジェクトに送信します 176 gl.shaderSource(shader, source); 177 178 // コンパイルシェーダー 179 gl.compileShader(shader); 180 181 // コンパイルが成功したかどうか? 182 if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { 183 alert('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader)); 184 gl.deleteShader(shader); 185 return null; 186 } 187 188 return shader; 189} 190/////////////////////////////////////////// 191window.onload =main; //実行 192///////////////////////////////////////////
そのコードはどこから持ってきたもんなんでしょうか
https://github.com/mdn/webgl-examples/tree/gh-pages/tutorial/sample2
ここから持っていきましたが一通り理解していて謎の部分があったので質問しました。
なら、その旨を質問に追記しましょう。
そこらへんの説明がまったくないとやばいですよ
ブラウザの JS は、すでにブラウザが持ってるイベントループの中で動くからでは。
hoshi-takanori様そいうことなのであれば回答をいただきたいです。
回答を要求する前に、そのサンプルコードは一回ドローして終了なサンプルなのでそれをOpenGLで書き直してもループ構造が不要なので引用したサンプルが質問の表題とはミスマッチです。そこを直してもらいたいところ。
あなたの回答
tips
プレビュー