2016-06-28 75 views
0

我正在读取具有图像数据的DICOM文件的Alpha通道,之后我使用this tutorial解析并呈现它,除此之外,我正在转发Alpha通道到一个webgl程序来渲染纹理。无法在WebGL中呈现Alpha通道作为纹理

但是,它适用于少数图像,它也失败了一些。 这里有一些用例:

SNO宽度高度状态

  1. 宽度:628,高度:888,α通道的长度:557664(正常工作)。

  2. 宽度:448,高度:612,alpha通道长度:274176(正常工作)。

  3. 宽度:446,高度:612,alpha通道长度:272952(不起作用)。

  4. 宽度:2219,高度:1200,alpha通道长度:2662800(不起作用)。

及使用情况下,3和4,我得到这些错误消息:

  • 错误:WebGL的:texImage2D:提供的缓冲区太小。 (需要2663999,有2662800)
  • 错误:WebGL:generateMipmap:纹理的基本级别不具有两个幂的幂。

有什么建议吗?

回答

0

错误实际上是他们所说的。

  1. Error: WebGL: texImage2D: Provided buffer is too small. (needs 2663999, has 2662800)

    你叫gl.texImage2D但质地的尺寸比你所提供的数据大。

    例如,如果你这样做

    var width = 16; 
    var height = 16; 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, 
           gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(10)); 
    

    你会得到相同的区域。您指定了一个纹理16x16xRGBA(4),其中 表示数据必须是16 * 16 * 4或1024字节,但上面的代码只能通过10个字节

    有一点需要注意的是UNPACK_ALIGNMENT。它默认为4 ,这意味着每行数据将被填充到4个字节。换言之和7x3的阿尔法纹理将成为

    width = 7 
    height = 3 
    bytesPerPixel = 1 // gl.ALPHA 
    unpaddedRowSize = width * bytesPerPixel 
    paddedRowSize = Math.floor((minBytesPerRow + 3)/4) * 4; // = 8 
    requiredDataSize = (height - 1 * paddedRowSize) + unpaddedRowSize 
    

    你可能会认为你只需要ALPHA 7x3或21字节,但你确实需要8 + 8 + 7或23字节,因为除了最后的每一行是填充4

    多你可以告诉WebGL的调用

    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); 
    

    设置UNPACK_ALIGNMENT 1现在只需要21个字节,因为它不会再垫行。除非纹理是2在两个维度上的功率

  2. Error: WebGL: generateMipmap: The base level of the texture does not have power-of-two dimensions

    WebGL的1.0不能用MIPS。你的示例纹理在任何一个维度中都不是2的幂,所以你不能使用mips,也不能为它们调用gl.generateMipmap

    相反,你必须设置你的纹理过滤,只使用顶部(0级)MIP

    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); // or gl.NEAREST 
    

    ,你必须将包装到CLAMP_TO_EDGE

    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 
    

    的WebGL 2.0消除这些限制

+0

我尝试了你提供的所有建议,但遗憾的是没有任何工作,但如果我保存了alpha c通道到一个单独的画布,并尝试将该画布渲染为webgl中的纹理,它可以工作 –