webGL2.0で,transformFeedBackを使ってGPGPUを行なっています.やってることはただのピンポンで,レンダリングするたびにvertexBufferをtransformFeedbackBufferと入れ替えるプログラムです.
そこで毎回,頂点座標にgl_VertexIDを足して更新する,といったプログラムにしたいのですが,一度目はちゃんと足され,二度目以降更新がされなくなります.
以下一部を抜粋したコードです
js
1 var particleNum=10; 2 var position = new Array(particleNum*3); 3 for (var i = 0; i < position.length; i++) { 4 position[i] = 0; 5 } 6 let vPosition = create_vbo(position); 7 vAttLocation[0] = gl.getAttribLocation(prg, "position"); 8 vAttStride[0] = 3; 9 10 const vTransformFeedback = [gl.createBuffer()]; 11 const transformFeedback = [gl.createTransformFeedback()]; 12 gl.bindBuffer(gl.ARRAY_BUFFER, vTransformFeedback[0]); 13 gl.bufferData(gl.ARRAY_BUFFER, Float32Array.BYTES_PER_ELEMENT * position.length , gl.DYNAMIC_COPY); 14 gl.bindBuffer(gl.ARRAY_BUFFER, null); 15 16 (function () { 17 set_attribute([vPosition], vAttLocation, vAttStride); 18 gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, transformFeedback[0]); 19 gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, vTransformFeedback[0]); 20 gl.beginTransformFeedback(gl.POINTS); 21 gl.drawArrays(gl.POINTS, 0, position.length/3); 22 gl.endTransformFeedback(); 23 var arrBuffer = new Float32Array(position.length); 24 gl.getBufferSubData(gl.TRANSFORM_FEEDBACK_BUFFER, 0, arrBuffer); 25 console.log(arrBuffer); 26 gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, null); 27 var temp = vPosition; 28 vPosition = vTransformFeedback[0]; 29 vTransformFeedback[0] = temp; 30 gl.flush(); 31 setTimeout(arguments.callee,1000); 32 //requestAnimationFrame(arguments.callee); 33 })();
glsl
1 void main(void){ 2 gl_Position=vec4(position,1.0); 3 outPosition=position+vec3(float(gl_VertexID)); 4 }
なってほしい結果はこんな感じです
ちなみにこれは,gl_VertexIDの代わりに頂点属性として自分でIDを設定した場合の画像です.
同じことしてるはずなんですけどちゃんと動いてるのでやっぱりgl_VertexIDがちゃんと機能してないのかな?と思いました
https://qiita.com/nami634/items/afc9ac7956bb21f76517
ここ見るとgl_VertexIDは必ず存在するけど定義されてない場合がある.と書いてあったのでその場合かなとも思いました.どのような場合に定義されないのか,といったことを知りたいです(上記の通り,他の方法でプログラムはできているのでそこは大丈夫です)よろしくお願いします.
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。