Skip to content

Instantly share code, notes, and snippets.

@diska
Created January 24, 2022 02:41
Show Gist options
  • Save diska/1301407c38b7fc78188b78dfdcd2aca9 to your computer and use it in GitHub Desktop.
Save diska/1301407c38b7fc78188b78dfdcd2aca9 to your computer and use it in GitHub Desktop.
transform feedback。WebGL2で頂点シェーダの出力するvaryingをarrayBufferとして見るだけ。
<canvas hidden></canvas><br>
<textarea id="LG" cols="30" rows="15"></textarea>
<script>"use strict";
const vsrc=`#version 300 es\nin vec4 i; out vec4 o; void main(){o=i*2.;}`;
const fsrc=`#version 300 es\nvoid main(){}`;
let cx=document.querySelector("canvas").getContext("webgl2");
let pg=cx.createProgram();const vout=["o"];{
let vs=cx.createShader(cx.VERTEX_SHADER);cx.attachShader(pg,vs);
let fs=cx.createShader(cx.FRAGMENT_SHADER);cx.attachShader(pg,fs);
cx.transformFeedbackVaryings(pg,vout,cx.SEPARATE_ATTRIBS);
cx.shaderSource(vs,vsrc);cx.compileShader(vs);
cx.shaderSource(fs,fsrc);cx.compileShader(fs);cx.linkProgram(pg);
LG.value+=`pg:${cx.getProgramInfoLog(pg)}\n`;
LG.value+=`vs:${cx.getShaderInfoLog(vs)}\n`;
LG.value+=`fs:${cx.getShaderInfoLog(fs)}\n`;
}
let bf=[cx.createBuffer(),cx.createBuffer()];{
cx.bindBuffer(cx.ARRAY_BUFFER,bf[0]);{
cx.bufferData(cx.ARRAY_BUFFER,8*4*4,cx.STATIC_DRAW);
let data=new Float32Array(8*4);for(let i=0;i<8*4;i++)data[i]=i;
cx.bufferSubData(cx.ARRAY_BUFFER,0,data);
cx.vertexAttribPointer(0,4,cx.FLOAT,false,0,0);
};cx.bindBuffer(cx.ARRAY_BUFFER,null);
cx.bindBuffer(cx.ARRAY_BUFFER,bf[1]);{
cx.bufferData(cx.ARRAY_BUFFER,8*4*4,cx.STATIC_DRAW);
};cx.bindBuffer(cx.ARRAY_BUFFER,null);
}
let tf=cx.createTransformFeedback();{
cx.bindTransformFeedback(cx.TRANSFORM_FEEDBACK,tf);{
cx.bindBufferBase(cx.TRANSFORM_FEEDBACK_BUFFER,0,bf[1]);
cx.useProgram(pg);cx.beginTransformFeedback(cx.POINTS);{
cx.enableVertexAttribArray(0);
cx.enable(cx.RASTERIZER_DISCARD);{
cx.drawArrays(0,0,8);
};cx.disable(cx.RASTERIZER_DISCARD);
};cx.endTransformFeedback();
};cx.bindTransformFeedback(cx.TRANSFORM_FEEDBACK,null);
}
cx.bindBuffer(cx.ARRAY_BUFFER,bf[1]);{
let data=new Float32Array(8*4);cx.getBufferSubData(cx.ARRAY_BUFFER,0,data);
for(let i=0;i<8*4;i+=4){
for(let j=0;j<4;j++){LG.value+=`${data[i+j]},`};LG.value+=`\n`;
};LG.value+=`\n`;
};cx.bindBuffer(cx.ARRAY_BUFFER,null);
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment