使用webgl2复制浮动纹理

时间:2017-03-28 21:17:18

标签: webgl2

我无法再在webgl2的规范中找到任何copyTexImage2D的痕迹:https://www.khronos.org/registry/webgl/specs/latest/2.0/

几个月前,我曾问过如何制作浮动纹理副本的问题。使用webgl版本1.0,这对于copyTexImage2D是不可能的(不支持float类型) 所以我通过构建一个简单的着色器来制作纹理副本。

我想象对float32类型的限制是用webgl2解除的。但我没有发现任何单词" copyTexImage2D"在webgl 2的规范中。

它是如何工作的? webgl2的规范只给出了自webgl1以来的新颖性或新的多态性函数?

简而言之,使用webgl2,复制纹理是一种更有效的方法吗?

(在我对webgl2的缓慢,非常缓慢的理解中,我还没有解决反馈的有趣新颖性)

3 个答案:

答案 0 :(得分:2)

WebGL2s规范只是添加到WebGL1。从最近的WebGL2规范开始

  

本文档应作为WebGL 1.0规范的扩展来阅读。它只描述与1.0的差异。

同样也说

  

本文档的其余部分旨在与OpenGL ES 3.0规范一起阅读(撰写本文时为3.0.4,可从Khronos OpenGL ES API Registry获得)。除非另有说明,否则每种方法的行为都由OpenGL ES 3.0规范定义。

所以,copyTexImage2D仍在那里。

您的blitFramebuffer解决方案有效

答案 1 :(得分:1)

copyTex[Sub]Image2D使用带有EXT_color_buffer_float扩展名的WebGL2中的浮点数。

我会注意到这也适用于带有扩展名的WebGL1:

  • 适用于float16s的OES_texture_half_float和EXT_color_buffer_half_float [1]
  • 用于float32s的OES_texture_float和WEBGL_color_buffer_float [1]

请注意有时令人困惑的差异:

  • WEBGL _ color_buffer_float适用于WebGL 1 ,仅支持RGBA32FRGBA / FLOAT用于纹理)
  • EXT _ color_buffer_ half _ float适用于WebGL 1 ,仅启用RGBA16FRGBA / {{ 1}}用于纹理)
  • EXT _ color_buffer_float适用于WebGL 2 ,可启用R / RG / RGBA 16F和32F,以及HALF_FLOAT_OES

(有关扩展程序的详情,请参阅WebGL Extension Registry

R11F_G11F_B10F也适用于WebGL2,但您需要EXT_color_buffer_float才能完成浮动帧缓冲。

[1]:Chrome中尚未提供EXT_color_buffer_half_float和WEBGL_color_buffer_float,但启用OES_texture_ [half_] float可能就足够了。在Chrome上,验证blitFramebuffer返回checkFramebufferStatus的每台计算机。

答案 2 :(得分:0)

好的,我找到了一个解决方案: blitFramebuffer

让texture1成为我们想要在texture2中复制的纹理。我们已经有两个framebuffer copieFB和FBorig。 copieFB对texture2有颜色附件, FBorig对texture1有颜色附件。

gl.bindFramebuffer ( gl.DRAW_FRAMEBUFFER, copieFB );
gl.bindFramebuffer ( gl.READ_FRAMEBUFFER, FBorig );
gl.readBuffer ( gl.COLOR_ATTACHMENT0 );
gl.blitFramebuffer(0, 0, PVS, PVS,0, 0, PVS, PVS,gl.COLOR_BUFFER_BIT, gl.NEAREST);

旧解决方案:

gl.bindFramebuffer( gl.FRAMEBUFFER , copieFB);
gl.viewport(0, 0, PVS, PVS);
gl.useProgram(copieShader);
gl.uniform1i(copieShader.FBorig,TEXTURE1);
gl.drawArrays(gl.POINTS , 0 , NBRE);

增益是一些FPS。