Javascript PMAP完成了吗?

Javascript PMAP完成了吗?,javascript,textures,webgl,requestanimationframe,mipmaps,Javascript,Textures,Webgl,Requestanimationframe,Mipmaps,在我的应用程序中,我为6x4096x4096立方体贴图纹理生成mipmap。下一步,我需要对纹理进行其他一些与时间相关的更改。所有绘图都在requestAnimationFrame的循环内完成 根据浏览器、设备等的不同,有时需要循环的三、四甚至五个连续帧才能最终生成这些mipmap,我需要知道mipmap是在哪一帧中完成的 所以问题是:如何检查由WebGL的命令“GenerateMippMap”为“TEXTURE_CUBE_MAP”生成的requestAnimationFrame的循环mipma

在我的应用程序中,我为6x4096x4096立方体贴图纹理生成mipmap。下一步,我需要对纹理进行其他一些与时间相关的更改。所有绘图都在requestAnimationFrame的循环内完成

根据浏览器、设备等的不同,有时需要循环的三、四甚至五个连续帧才能最终生成这些mipmap,我需要知道mipmap是在哪一帧中完成的


所以问题是:如何检查由WebGL的命令“GenerateMippMap”为“TEXTURE_CUBE_MAP”生成的requestAnimationFrame的循环mipmap的哪一帧已就绪?是否有一些标志用于检查“generateMipmap”完成的状态?

generateMipmap
是一个“同步”调用。浏览器可以在实际生成mip级别之前,通过立即返回来尝试对其进行优化,第一次使用调用了
generateMipmap
的纹理将确保可以使用mip级别。要将其编码为:

const texture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, /* ... */);
gl.generateMipmap(gl.TEXTURE_2D);
gl.uniform1i(someSamplerUniform, 0);
gl.drawArrays(/* ... */); // Here WebGL implementation will make sure that
                          // mip-levels for tetxure are ready. If they aren't,
                          // this call will cause blocking.
如果更改纹理0 mip级别的内容,则需要再次调用
generateMipmap


有关此行为的更多信息。

无法确定generateMipmap何时完成或需要多长时间。我很惊讶它需要这么长的时间,但如果问题是你想避免jank,一个解决方案就是制作你自己的mips。通过这种方式,您可以在每帧或甚至每帧中为每个面上载一个lod 较小的增量

另一个可能的解决方案,但可能只适用于Chrome,就是用类似

gl.generateMipmap(...);
gl.flush();  // make sure the previous command will be executed

// now do something to wait 4 frames like
var framesToWait = 4;
function render() {
  if (framesToWait) {
    --framesToWait;
  } else {
     ... call drawArrays ...
  }
  requestAnimationFrame(render);
}
requestAnimationFrame(render);
这可能有效,因为chrome是多进程的。但我不确定重点是什么


在WebGL2中,您可以使用FenceSync对象来确定某项工作何时完成。

谢谢您的回答。我的问题不是WebGL命令的顺序,而是requestAnimationFrame的循环行为。假设我在帧编号0处调用“generateMipmap”。然后我想知道需要多少帧来完成mipmap的生成,因为在这些帧的最后一帧中,我想调用像“DrawArray”这样的函数。我不需要预先知道确切的帧数,只需要在作业(生成mipmap)完成时使用某种“if”语句进行检查。没有API可用于此。此外,正如我所说,
generateMipmap
可能会锁定,直到完成。此外,用户的硬件在这里起着重要作用,因此也无法可靠地获得生成mip级别所需的帧数。如果不需要频繁重新生成mipmap,我建议只在同一帧(或者下一帧)中使用纹理。如果您需要频繁更新纹理,那么寻找避免使用mipmapping的方法是有意义的。我之所以需要(乍一看可能很奇怪)是因为我使用了一些时间参数t,我将其传递给类似“DrawArray”的调用。我需要知道“generateMipmap”何时完成(在哪个帧中),这样我就可以传递“drawArrays(t)”t的正确值(我测量requestAnimationFrame循环的每个帧的持续时间)。正如我所说,不幸的是,没有显式的API来检查
generateMipmap
结果。但是,在返回后,正确地考虑<代码> EngaseMIPMAP>代码>是正确的。顺便说一句,请记住,测量时间
requestAnimationFrame
回调对于测量性能有些无用(如果这是您对pre参数的要求),因为draw调用(以及其他一些WebGL调用)是异步的。我检查了“gl.generateMipmap(gl.TEXTURE\u CUBE\u MAP)”函数的返回值,它总是“undefined”,并在调用它的同一帧中返回,但仍然需要几个帧来生成mipmap(通常从3到5-我可以通过查看每个帧的持续时间来判断;不幸的是,它强烈依赖于设备,因此我无法在所需的“if”语句中使用此值)。