Created
January 24, 2022 02:41
-
-
Save diska/1301407c38b7fc78188b78dfdcd2aca9 to your computer and use it in GitHub Desktop.
transform feedback。WebGL2で頂点シェーダの出力するvaryingをarrayBufferとして見るだけ。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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