浏览器绘制时间之外的WebGL渲染
我们正在构建一个WebGL应用程序,它具有一些高渲染负载对象。是否有一种方法可以在浏览器绘制时间之外(即在背景中)渲染这些对象?我们不希望FPS下降,中断渲染过程是可能的(在帧之间分割)。想到三个想法浏览器绘制时间之外的WebGL渲染,webgl,Webgl,我们正在构建一个WebGL应用程序,它具有一些高渲染负载对象。是否有一种方法可以在浏览器绘制时间之外(即在背景中)渲染这些对象?我们不希望FPS下降,中断渲染过程是可能的(在帧之间分割)。想到三个想法 可以通过帧缓冲区在多个帧上渲染到纹理,完成后将该纹理渲染到画布 const gl=document.querySelector('canvas').getContext('webgl'); 常数vs=` 属性向量4位置; 属性向量2 texcoord; 可变矢量2 v_texcoord; voi
const gl=document.querySelector('canvas').getContext('webgl');
常数vs=`
属性向量4位置;
属性向量2 texcoord;
可变矢量2 v_texcoord;
void main(){
gl_位置=位置;
v_texcoord=texcoord;
}
`;
常数fs=`
高精度浮点;
均匀采样2d-tex;
可变矢量2 v_texcoord;
void main(){
gl_FragColor=纹理2d(tex,v_texcoord);
}
`;
//编译着色器、链接程序、查找位置
const programInfo=twgl.createProgramInfo(gl[vs,fs]);
//gl.createBuffer、gl.bindBuffer、gl.bufferData
const bufferInfo=twgl.createBufferInfoFromArrays(gl{
职位:{
NUM组件:2,
数据:[
-1, -1,
1, -1,
-1, 1,
-1, 1,
1, -1,
1, 1,
],
},
特克斯库尔德:{
NUM组件:2,
数据:[
0, 0,
1, 0,
0, 1,
0, 1,
1, 0,
1, 1,
],
},
});
//使用纹理和深度缓冲区创建帧缓冲区
//与画布大小相同
//gl.createTexture、gl.texImage2D、gl.createFramebuffer
//gl.framebufferTexture2D
const framebufferInfo=twgl.createFramebufferInfo(gl);
const infoElem=document.querySelector('info');
常量numDrawSteps=16;
设drawStep=0;
设时间=0;
//画几个框架。准备就绪时返回true
函数绘图(){
//按纹理绘制
//gl.bindFrambuffer,gl.viewport
twgl.bindFramebufferInfo(gl,framebufferInfo);
如果(drawStep==0){
//在第一步,清除并记录时间
gl.禁用(gl.剪刀试验);
gl.clearColor(0,0,0,0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
时间=性能。现在()*0.001;
}
//这代表画一些东西。
总帐启用(总帐剪刀测试);
const halfWidth=framebufferInfo.width/2;
const halfHeight=framebufferInfo.height/2;
常数a=时间*0.1+绘图步长
常数x=数学cos(a)*半宽+半宽;
常数y=数学sin(a*1.3)*半高+半高;
gl.剪刀(x,y,16,16);
gl.clearColor(
第16/16号决议,
提取步骤/6%1,
提取步骤/3%1,
1);
总账清除(总账颜色缓冲位);
drawStep=(drawStep+1)%numDrawSteps;
返回drawStep==0;
}
设frameCount=0;
函数render(){
++帧数;
infoElem.textContent=帧数;
if(draw()){
//画到画布上
//gl.bindFramebuffer,gl.viewport
twgl.bindFramebufferInfo(gl,null);
gl.禁用(gl.深度测试);
总账禁用(总账混合);
gl.禁用(gl.剪刀试验);
总账使用程序(programInfo.program);
//gl.bindBuffer、gl.EnableVertexAttribute数组、gl.VertexAttribute指针
twgl.setBuffersAndAttributes(总帐、程序信息、缓冲信息);
//德国劳埃德船级社制服。。。
twgl.setUniformsAndBindTextures(programInfo{
tex:framebufferInfo.attachments[0],
});
//画正方形
gl.绘图阵列(gl.三角形,0,6);
}
请求动画帧(渲染);
}
请求动画帧(渲染)代码>