タイトルの通りですが,今までとほぼ同じように書いてるつもりなのですが,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 }
回答1件
あなたの回答
tips
プレビュー