Glsl WebGL中的体绘制

Glsl WebGL中的体绘制,glsl,webgl,volume-rendering,Glsl,Webgl,Volume Rendering,我有一个科学数据的3D数组数据集,将使用WebGL进行渲染。这是我编写的代码,也是我迄今为止取得的成果 我对输出画布上发生的两件事一无所知: gl.clearcolor(0.4,0.4,0.5,1); 屏幕渲染输出时不工作 有时在drawScene调用中,代码会抛出错误和警告。我相信这一警告是针对该错误的,但我无法调试导致该错误的原因: 警告: WebGL:无效的_操作:texImage3D:ArrayBufferView不够大,无法满足请求 错误:texImage3D(纹理3D{WebG

我有一个科学数据的3D数组数据集,将使用WebGL进行渲染。这是我编写的代码,也是我迄今为止取得的成果

我对输出画布上发生的两件事一无所知:

  • gl.clearcolor(0.4,0.4,0.5,1); 屏幕渲染输出时不工作


  • 有时在drawScene调用中,代码会抛出错误和警告。我相信这一警告是针对该错误的,但我无法调试导致该错误的原因:

  • 警告: WebGL:无效的_操作:texImage3D:ArrayBufferView不够大,无法满足请求

    错误:texImage3D(纹理3D{WebGLTexture(“未命名”)},0,R8,64,64,64,64,0,红色,无符号字节,Uint8Array(65536))中的错误:无效的纹理操作


    3) 渲染输出的预期输出为:



    但渲染输出未显示所需的颜色贴图输出

    这是一个现场演示:

    如果此代码段在任何情况下均未加载,则这是输出:

    PS:如果代码段未加载,请滑动右上角的滑块。

    第一期 R8的64*64*64=262144字节,但您要传递的数组只有65536字节大

    第二期 当代码上载查找映射时,它只显示红色

        gl.texImage2D(gl.TEXTURE_2D, 0, gl.R8, gl.RED, gl.UNSIGNED_BYTE, image);
    
    你可能想要

        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB8, gl.RGB, gl.UNSIGNED_BYTE, image);
    
    第三期 至于清除颜色,WebGL默认情况下,每次将画布与页面合成时都会清除画布。因为您清除了画布,然后异步加载数据,然后绘制流中的数据

  • 将drawingbuffer清除为某种颜色
  • 异步加载数据
  • 浏览器将画布的drawingbuffer与清除的颜色合成到页面中
  • 浏览器将画布drawingbuffer清除为0,0,0,0
  • 数据加载完成
  • 在清除的drawingbuffer上使用WebGL绘制
  • 浏览器将画布的drawingbuffer合成到页面

  • 这就是你看到它闪烁的原因。如果您将呼叫移动到
    gl.clear
    loadData
    中,它将工作。

    感谢您的回复,是的,但错误只是偶尔出现,而且每次出现错误时字节数都不相同。添加了第二个和第三个问题。解决了该大小错误是因为读取数据块中的读取器。感谢您的建议,解决了第二个问题,但现在的问题是渲染输出的质量非常低。我不知道了解第三个问题的解决方案,我希望你能在答案中添加更多细节。谢谢
        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB8, gl.RGB, gl.UNSIGNED_BYTE, image);