質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

解決済

1回答

4378閲覧

「WebGL」 INVALID_OPERATION: エラーが発生する理由が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

1グッド

0クリップ

投稿2021/04/26 07:52

編集2021/04/26 09:02

提示コードの////コメントの内部のコードですが以下の三つの警告が発生する原因が知りたいです。なぜ「 場所が現在のプログラムのものではありません 」と表示されるのでしょうか?attributeやuniform はメイン関数でしっかり値を設定しているはずなのですが原因がわかりません。
また「 使用中の有効なシェーダープログラムがありません 」の意味もわかりません。なぜglUseProgram();していてエラーも出ていないのにも関わらず有効なシェーダーにならないのでしょうか?すべてが謎です。

コードは参考サイトからダウンロードしてきたものを自分なりに触っています。(触る前は動いていました。)
参考サイト: https://developer.mozilla.org/ja/docs/Web/API/WebGL_API/Tutorial/Adding_2D_content_to_a_WebGL_context
参考サイトGithub

公式リファレンス

警告(原文)

script.js:242 WebGL: INVALID_OPERATION: uniformMatrix4fv: location is not from current program
drawScene @ script.js:242
main @ script.js:93

script.js:243 WebGL: INVALID_OPERATION: uniformMatrix4fv: location is not from current program
drawScene @ script.js:243
main @ script.js:93

script.js:245 WebGL: INVALID_OPERATION: drawArrays: no valid shader program in use

Google翻訳
[

script.js:242 WebGL:INVALID_OPERATION:uniformMatrix4fv:場所が現在のプログラムのものではありません
drawScene @ script.js:242
main @ script.js:93

script.js:243 WebGL:INVALID_OPERATION:uniformMatrix4fv:場所が現在のプログラムのものではありません
drawScene @ script.js:243
main @ script.js:93

script.js:245 WebGL:INVALID_OPERATION:drawArrays:使用中の有効なシェーダープログラムがありません

]

js

1 2 3 4 5//モデルの情報 6let model = 7{ 8 Translate: 9 { 10 x: 0, 11 y: 0, 12 z: -4, 13 }, 14 15 Rotate: 16 { 17 x: 0, 18 y: 0, 19 z: 0, 20 }, 21 22 Scale: 23 { 24 x: 1, 25 y: 1, 26 z: 1, 27 }, 28}; 29 30 31 32let canvas; //キャンバス 33let gl; //コンテキスト 34//var shaderProgram; //シェーダープログラムを作成 35let buffers; //バッファー 36 37let programInfo = { attribLocations: {},uniformLocations: {} }; //プログラム 38 39 40 41 42// 43// エントリーポイント 44// 45function main() 46{ 47 48 49 canvas = document.querySelector('#glcanvas'); //キャンバスを取得 50 gl = canvas.getContext('webgl'); //webGLコンテキストを作成 51 //webGLコンテキストの作成に失敗した時 52 if (!gl) 53 { 54 alert("webGLコンテキストの作成失敗"); 55 } 56 57 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 58 // 頂点シェーダーコード 59 const vsSource = ` 60 attribute vec4 aVertexPosition; 61 62 uniform mat4 uModelViewMatrix; 63 uniform mat4 uProjectionMatrix; 64 65 void main() { 66 gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition; 67 } 68 `; 69 70 // フラグメントシェーダー 71 const fsSource = ` 72 void main() { 73 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); 74 } 75 `; 76 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 77 78 79 80 81 82 83//////////////////////////////////////////////////////////////////////////////////////////////////////////// 84//シェーダープログラムオブジェクトを作成 85const shaderProgram = initShaderProgram(gl, vsSource, fsSource);//シェーダープログラムを作成 86 87programInfo.shaderProgram = shaderProgram; 88programInfo.attribLocations.vertexPosition = gl.getAttribLocation(shaderProgram,'aVertexPosition'); 89programInfo.uniformLocations.projectionMatrix = gl.getUniformLocation(shaderProgram,'uProjectionMatrix'); 90programInfo.uniformLocations.modelViewMatrix = gl.getUniformLocation(shaderProgram,'uModelViewMatrix'); 91 92 buffers = initBuffers(gl); //バッファーを作成 93 drawScene(gl, programInfo, buffers); //描画 94//////////////////////////////////////////////////////////////////////////////////////////////////////////// 95 96 97 98} 99 100 101//Update() 102function Update() 103{ 104 //window.requestAnimationFrame(Update); 105 106} 107 108//Draw 109function Draw() 110{ 111 //window.requestAnimationFrame(Draw); 112 113} 114 115 116 117 118//キー入力 119function InputKey() 120{ 121 122 document.body.addEventListener("keydown",event => { 123 124 //スペースキー 125 if(event.key == " ") 126 { 127 //alert("キーが押されました。"); 128 console.log("Space"); 129 } 130 else if(event.key == "ArrowLeft") 131 { 132 //alert("キーが押されました。"); 133 console.log("Left"); 134 model.Translate.x += -1 / 640; 135 } 136 else if(event.key == "ArrowRight") 137 { 138 //alert("キーが押されました。"); 139 console.log("Right"); 140 model.Translate.x += 1 / 640; 141 142 } 143 else if(event.key == "ArrowUp") 144 { 145 //alert("キーが押されました。"); 146 console.log("Up"); 147 } 148 else if(event.key == "ArrowDown") 149 { 150 //alert("キーが押されました。"); 151 console.log("Down"); 152 } 153}); 154 155} 156 157 158 159//バッファを初期化 160function initBuffers(gl) 161{ 162 163 // 正方形の位置用のバッファを作成します。 164 const positionBuffer = gl.createBuffer(); 165 166 //バッファを適用 167 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); 168 169 //正方形の頂点の配列 170 const positions = [ 171 1.0, 1.0, 172 -1.0, 1.0, 173 1.0, -1.0, 174 -1.0, -1.0, 175 ]; 176 177 //バッファーオブジェクトのデータストアを初期化 178 gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW); 179 180 return { 181 position: positionBuffer, 182 }; 183} 184 185 186//シーンを描画 187function drawScene(gl, program, buffers) 188{ 189 gl.clearColor(0.0, 0.0, 0.0, 1.0); // カラーバッファを初期化 190 gl.clearDepth(1.0); // 深度バッファを初期化 191 gl.enable(gl.DEPTH_TEST); // 深度テスト 192 gl.depthFunc(gl.LEQUAL); // 深度比較する値を設定 193 194 //キャンバスに描画を開始する前に、キャンバスをクリア 195 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 196 197 198 //パースペクティブマトリックスを作成します 199 const fieldOfView = 45 * Math.PI / 180; // in radians 200 const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight; 201 const zNear = 0.1; 202 const zFar = 100.0; 203 204 //射形行列 205 const projectionMatrix = mat4.create(); 206 mat4.perspective(projectionMatrix,fieldOfView,aspect,zNear,zFar); 207 208 //ビュー行列 209 210 //平行移動 211 let translate = new mat4.create(); 212 mat4.translate(translate,translate,[model.Translate.x,model.Translate.y,model.Translate.z]); 213 214 //回転 215 let rotation = new mat4.create(); 216 mat4.rotate(rotation,rotation,0,[model.Rotate.x,model.Rotate.y,model.Rotate.z]); 217 218 //拡大縮小 219 let scale = new mat4.create(); 220 mat4.scale(scale,scale,[model.Scale.x,model.Scale.y,model.Scale.z]); 221 222 223// translate * rotate * scale 224 let modelViewMatrix = new mat4.create(); 225 let rs = new mat4.create(); 226 let trs = new mat4.create(); 227 mat4.multiply(rs,rotation,scale); 228 mat4.multiply(trs,translate,rs); 229 modelViewMatrix = trs; 230 231 232 233 gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position); //バッファーを適用 234 gl.vertexAttribPointer(program.attribLocations.vertexPosition,2,gl.FLOAT,false,0,0); //バッファーの頂点属性を統合 235 gl.enableVertexAttribArray(program.attribLocations.vertexPosition); //バッファーの頂点属性を有効化 236 237 //シェーダーを使う 238 gl.useProgram(program.shaderprogram); 239 240///////////////////////////////////////////////////////////////////////////////////////// 241 // uniform 変数を設定 242 gl.uniformMatrix4fv(program.uniformLocations.projectionMatrix,false,projectionMatrix); 243 gl.uniformMatrix4fv(program.uniformLocations.modelViewMatrix,false,modelViewMatrix); 244 245 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); //描画 246///////////////////////////////////////////////////////////////////////////////////////// 247 248 249} 250 251//シェーダーを作成 252function initShaderProgram(gl, vsSource, fsSource) 253{ 254 const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource); 255 const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource); 256 257 //シェーダープログラムを作成 258 const shaderProgram = gl.createProgram(); 259 gl.attachShader(shaderProgram, vertexShader); 260 gl.attachShader(shaderProgram, fragmentShader); 261 gl.linkProgram(shaderProgram); 262 263 // もしシェーダープログラムの作成に失敗したら 264 if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { 265 alert('シェーダープログラム作成に失敗: ' + gl.getProgramInfoLog(shaderProgram)); 266 return null; 267 } 268 269 return shaderProgram; 270} 271 272//シェーダーをロード 273function loadShader(gl, type, source) 274{ 275 const shader = gl.createShader(type); 276 277 // ソースをシェーダーオブジェクトに送信します 278 gl.shaderSource(shader, source); 279 280 // コンパイルシェーダー 281 gl.compileShader(shader); 282 283 // コンパイルが成功したかどうか? 284 if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { 285 alert('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader)); 286 gl.deleteShader(shader); 287 return null; 288 } 289 290 return shader; 291} 292 293 window.onload = main; //実行 294
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分のコーディングのスペルミスでした。自己解決です。

間違え

js

1//シェーダーを使う 2 gl.useProgram(program.shaderprogram);

正しい

js

1//シェーダーを使う 2 gl.useProgram(program.shaderProgram);

投稿2021/04/27 07:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問