在WebGL中,片段着色器可以用于设置LUMINANCE纹理吗?

时间:2019-01-30 15:21:46

标签: webgl textures shader

我正在使用WebGL进行某些图像处理,并且我希望片段着色器输出到1或2通道纹理。我可以将RGBA或RGB纹理附加到帧缓冲区并成功输出到那些帧缓冲区。但是,如果我将LUMINANCE或LUMINANCE_ALPHA纹理附加到帧缓冲区,则fb状态显示为不完整,并且不起作用。希望避免不必要的额外纹理通道,但不确定是否可行。感谢您的任何建议!

如果将格式更改为下面的gl.RGBA,那么它将起作用:

gl.getExtension("OES_texture_float")
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
var format = gl.LUMINANCE;
gl.texImage2D(gl.TEXTURE_2D, 0, format, 512, 512, 0, format, gl.FLOAT, null);
var fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
  alert("framebuffer not complete");
}

2 个答案:

答案 0 :(得分:0)

在WebGL1中,仅保证3种帧缓冲区附件组合有效

来自the spec, section 6.8

  

以下所有帧缓冲对象附件的组合,当所有附件都是完整的帧缓冲附件,非零且具有相同的宽度和高度时,必须导致帧缓冲完整:

     
      
  • COLOR_ATTACHMENT0 = RGBA / UNSIGNED_BYTE纹理
  •   
  • COLOR_ATTACHMENT0 = RGBA / UNSIGNED_BYTE纹理+ DEPTH_ATTACHMENT = DEPTH_COMPONENT16渲染缓冲区
  •   
  • COLOR_ATTACHMENT0 = RGBA / UNSIGNED_BYTE纹理+ DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL渲染缓冲区
  •   

所有其他组合都取决于实现。

(注意:WebGL1所基于的OpenGL ES 2.0不保证任何有效期的组合

在WebGL2 a bunch of format/type combinations are guaranteed to work中,但LUMINANCE/FLOAT不是其中之一。

答案 1 :(得分:0)

您可以查看https://geotiffjs.github.io/cog-explorer,以获取有关如何使用FLOAT和LUMINANCE数据的一些示例。加载示例“ Landsat 8示例1”或“ Landsat 8示例2”,并通过webglrenderer.js进行调试。