首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用webgl2复制浮点纹理

使用webgl2复制浮点纹理
EN

Stack Overflow用户
提问于 2017-03-29 05:17:18
回答 3查看 567关注 0票数 0

我在webgl2:https://www.khronos.org/registry/webgl/specs/latest/2.0/的规范中再也找不到任何copyTexImage2D的踪迹了

几个月前,我问过如何制作浮动纹理副本的问题。在WebGL1.0版本中,这在copyTexImage2D中是不可能的(不支持浮点类型),所以我通过构建一个简单的着色器来制作一个纹理副本。

我以为webgl2取消了对float32类型的限制。但是我在WebGL2的规范中没有发现任何"copyTexImage2D“这个词的出现。

它怎麽工作?自webgl1以来,webgl2的规范只给出了新的或新的多态性函数。

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

(在我对webgl2的缓慢、非常缓慢的理解中,我还没有解决反馈的有趣的新奇之处)

EN

回答 3

Stack Overflow用户

发布于 2017-03-30 07:18:14

WebGL2s规范只是添加到WebGL1中。从一开始的WebGL2规范开始

本文档应作为WebGL 1.0规范的扩展阅读。它将只描述与1.0的区别。

同样,它还说

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

所以,copyTexImage2D还在那里。

不过,您的blitFramebuffer解决方案可以正常工作

票数 2
EN

Stack Overflow用户

发布于 2017-04-21 18:30:22

在带有EXT_color_buffer_float扩展的WebGL2中,copyTex[Sub]Image2D可以处理浮点数。

我要指出的是,这也适用于带有扩展的WebGL1:

适用于float16s

  • OES_texture_float的
  • OES_texture_half_float和EXT_color_buffer_half_float1以及适用于float32s

的WEBGL_color_buffer_float1

注意有时令人困惑的区别:

  • WEBGL_color_buffer_float用于WebGL1,并且仅启用RGBA32F (用于textures)
  • EXT_color_buffer_half_float的RGBA/FLOAT用于WebGL1,并且仅启用RGBA16F (用于WebGL的RGBA/D26用于WebGLE131和E232),并启用R/RG/RGBA16F和32F以及WEBGLE232

(有关扩展的更多信息,请参阅WebGL Extension Registry )

blitFramebuffer也可以在WebGL2上工作,不过你需要EXT_color_buffer_float才能让浮动帧缓冲区完整。

1: Chrome还没有提供EXT_color_buffer_half_float和WEBGL_color_buffer_float,但启用OES_texture_half_float可能就足够了。在Chrome上,验证每台机器上的checkFramebufferStatus是否返回FRAMEBUFFER_COMPLETE

票数 1
EN

Stack Overflow用户

发布于 2017-03-29 21:39:36

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

让texture1作为我们想要在texture2中复制的纹理。我们已经有了两个帧缓冲区copieFB和FBorig。copieFB具有对texture2颜色附着性,FBorig具有对texture1的颜色附着性。

代码语言:javascript
复制
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);

旧的解决方案:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43080126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档