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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WebGL

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

Q&A

解決済

1回答

2302閲覧

webGLエラー location not for current programが出るようになった

ukey

総合スコア12

WebGL

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

0グッド

0クリップ

投稿2018/02/04 03:35

編集2018/02/04 03:40

タイトルの通りですが,今までとほぼ同じように書いてるつもりなのですが,uniform変数を送る際に location not for current programというエラーが出るようになりました

以下は簡単なパーティクルのプログラムなのですが,renderループの際のgl.uniform1f(uniLocation[0], (new Date().getTime() - startTime) * 0.001); においてエラーが発生します(renderループ外でやると出ません)
その1行前にコメントアウトされているgl.useProgram(prg);を挿入するとエラーは発生しないのですが,なにぶん今までこのようなエラーは出ていなかったので何が原因なのかわかりません
開発環境は
MacBook Air (13-inch, Early 2015)
CPU 2.2 GHz Intel Core i7
メモリ 8 GB 1600 MHz DDR3

google chromeのバージョン: 63.0.3239.132です
firefoxやchrome canaryでも試しましたが同じエラーが出ました

以下コードです

javascript

1window.addEventListener("load", function () { 2 var c = document.getElementById("canvas"); 3 var cw = window.innerWidth; 4 var ch = window.innerHeight; 5 c.width = cw; c.height = ch; 6 var gl = c.getContext("webgl2") || c.getContext("webgl") || c.getContext("experimental-webgl"); 7 var prg = create_program(create_shader("vs"), create_shader("fs")); 8 var uniLocation = []; 9 var attLocation = []; 10 var attStride = []; 11 12 uniLocation[0] = gl.getUniformLocation(prg, "time"); 13 14 var particleNum = 1000; 15 var position = new Array(particleNum * 3).fill(0); 16 var velocity = new Array(particleNum * 3).fill(0).map(function (e, i, a) { 17 return Math.random() * 2 - 1; 18 }); 19 20 var vPosition = create_vbo(position); 21 attLocation[0] = gl.getAttribLocation(prg, "position"); 22 attStride[0] = 3; 23 24 var vVelocity = create_vbo(velocity); 25 attLocation[1] = gl.getAttribLocation(prg, "velocity"); 26 attStride[1] = 3; 27 28 set_attribute([vPosition, vVelocity], attLocation, attStride); 29 30 gl.clearColor(242 / 255, 242 / 255, 232 / 255, 1.0); 31 var startTime = new Date().getTime(); 32 33 (function render(){ 34 gl.clear(gl.COLOR_BUFFER_BIT); 35 //gl.useProgram(prg); 36 gl.uniform1f(uniLocation[0], (new Date().getTime() - startTime) * 0.001); 37 gl.drawArrays(gl.POINTS, 0, particleNum); 38 gl.flush(); 39 requestAnimationFrame(render); 40 })(); 41 42 function create_shader(id) { 43 var shader; 44 var scriptElement = document.getElementById(id); 45 if (!scriptElement) { return; } 46 switch (scriptElement.type) { 47 case "x-shader/x-vertex": 48 shader = gl.createShader(gl.VERTEX_SHADER); 49 break; 50 case "x-shader/x-fragment": 51 shader = gl.createShader(gl.FRAGMENT_SHADER); 52 break; 53 default: 54 return; 55 } 56 gl.shaderSource(shader, scriptElement.text); 57 gl.compileShader(shader); 58 if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { 59 return shader; 60 } else { 61 alert(gl.getShaderInfoLog(shader)); 62 console.log(gl.getShaderInfoLog(shader)); 63 } 64 } 65 function create_program(vs, fs) { 66 var program = gl.createProgram(); 67 gl.attachShader(program, vs); 68 gl.attachShader(program, fs); 69 gl.linkProgram(program); 70 if (gl.getProgramParameter(program, gl.LINK_STATUS)) { 71 gl.useProgram(program); 72 return program; 73 } else { 74 return null; 75 } 76 } 77 function create_vbo(data) { 78 var vbo = gl.createBuffer(); 79 gl.bindBuffer(gl.ARRAY_BUFFER, vbo); 80 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW); 81 gl.bindBuffer(gl.ARRAY_BUFFER, null); 82 return vbo; 83 } 84 85 function set_attribute(vbo, attL, attS) { 86 for (var i in vbo) { 87 gl.bindBuffer(gl.ARRAY_BUFFER, vbo[i]); 88 gl.enableVertexAttribArray(attL[i]); 89 gl.vertexAttribPointer(attL[i], attS[i], gl.FLOAT, false, 0, 0); 90 } 91 } 92 93 window.addEventListener("resize", function (e) { 94 cw = e.target.innerWidth; 95 ch = e.target.innerHeight; 96 c.width = cw; 97 c.height = ch; 98 gl.viewport(0, 0, cw, ch); 99 }); 100});

vertexShader

glsl

1#version 300 es 2 layout (location = 0)in vec3 position; 3 layout (location = 1)in vec3 velocity; 4 uniform float time; 5 6 void main(void){ 7 gl_PointSize=5.0; 8 vec3 p=position; 9 p+=velocity*time*time; 10 gl_Position = vec4(p, 1.0); 11 }

fragmentShader

glsl

1#version 300 es 2 precision highp float; 3 out vec4 outColor; 4 void main(void){ 5 outColor=vec4(1.0,0.0,0.0,1.0); 6 }

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

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

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

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

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

masaya_ohashi

2018/02/05 02:31

使っているコードはこれで全部ですか?このjavascriptはどこに記述されていて、どこから参照されますか?
masaya_ohashi

2018/02/05 02:33

window.addEventListener("load", function () { の先頭に、console.log("aaa"); 等のテスト出力を入れてみて、ログ出力に「1回だけ」aaaと表示されるか確認してみてください。
ukey

2018/02/06 04:29

なるほど.........先日プログラムを修正していつの間にかこの質問のエラーは出なくなったのですが,そう言えばindex.htmlにscriptの読み込みのタグを二回記入していて片方消した気がします.そういうことなのですか.....?
guest

回答1

0

ベストアンサー

同じスクリプトが2回読み込まれていれば、window.addEventListenerで登録した処理が2回実行されることになります。その際におそらく2度めのcreate_programが実行され、ページ上にprgが2個生成されたことになり、不具合を起こしていたものと思われます。

投稿2018/02/06 04:35

masaya_ohashi

総合スコア9206

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問