优化webgl(draw)调用开销

优化webgl(draw)调用开销,webgl,Webgl,我正在尝试使用模具缓冲区来使用WebGL渲染三维模型的横截面。我还使用了一个库-three.js,它为我提供了一个场景图和各种其他抽象 Three.js公开了一个回调,该回调在我用来进行模具调用的gl.drawerelements之前和之后被称为。如果我将渲染顺序留给三方管理,则最终会出现以下情况: 这看起来很多余: gl.disable(STENCIL_TEST) //disable followed immediately by enable gl.enable(STENCIL_TEST)

我正在尝试使用模具缓冲区来使用WebGL渲染三维模型的横截面。我还使用了一个库-three.js,它为我提供了一个场景图和各种其他抽象

Three.js公开了一个回调,该回调在我用来进行模具调用的gl.drawerelements之前和之后被称为。如果我将渲染顺序留给三方管理,则最终会出现以下情况:

这看起来很多余:

gl.disable(STENCIL_TEST) //disable followed immediately by enable
gl.enable(STENCIL_TEST)

gl.stencilFunc(...) //same call for multiple draw calls
gl.stencilOp(...)
看起来需要一些杂技才能用three.js批量处理这些文件,我想知道这是否值得。我一直在读WebGL(draw?)调用的开销,但我并不真正了解它们的重量。很明显,当一个调用合并并绘制一组几何体时会发生什么,但我不明白其他调用会发生什么

我甚至不完全确定如何测试它,在这些绘制调用之间多次切换模具开/关是否足够,直到出现帧下降

我只想在发出多个绘制调用之前启用模具一次,并在最后一次调用之后禁用它。我想将
stencilOp
stencilFunc
更改为该组draw调用中的某个位置,但我不确定从中可以获得多少收益

我不是问如何使用three.js实现这一点

有几种相对简单的方法可以用三个。需要批处理的几何体可以放在它们自己的场景中,并且可以在渲染之前和之后设置模具状态。另一种方法是手动排序所有内容,并仅在第一个模板调用之前进行模板调用

我的问题是,如果以及为什么这个命令队列因任何原因看起来不同?

调用
gl.enable(STENCIL\u TEST)
gl.stencilOp()
,调用5次和255次有什么区别,是可以忽略还是不可以忽略

编辑

我减少了调用次数,在渲染不透明对象时达到了预期效果。然而,透明度现在变得更加复杂了。我正在试图理解
Sceenshot#2
中4k和5k“调用”的区别是什么。这是我应该关注的事情,还是有选择地关注的事情


您如何保证提款顺序?你能把一些东西放在一个单独的场景中,然后打开模具,绘制场景,关闭模具,绘制其他场景或者沿着这些线的东西吗?这真的是一个WebGL问题吗?看起来你也在问如何让three.js按你想要的方式运行。是的,可以保证渲染顺序,也可以使用多个场景渲染,但这并不是three期望的方式。然而,这更像是应该做什么以及为什么要做。我感兴趣的是这个webgl队列发生了什么,而不是它是如何发生的,如果这有意义的话?这不是“如何使用三个”的问题,而是“我应该让我的webgl看起来像这样吗”^ webgl队列正在发生(没有发生)^,我确实知道是什么导致它看起来像这样。无法再编辑了。