将单个纹理的子集渲染到 WebGL canvas 的最快方法是什么?
What is the fastest way to render subsets of a single texture onto a WebGL canvas?
如果您有一个单一的二次方 width/height 纹理(例如 2048)并且您希望尽快将其缩放和平移的子集(例如按比例缩小的 64x92 大小的图块)blit 掉到另一个纹理上(作为缓冲区,以便在不脏时可以缓存),然后将该纹理绘制到 webgl canvas,你没有更多的要求 - 最快的策略是什么?
是否首先加载源纹理,将空纹理绑定到帧缓冲区,将带有 drawElementsInstancedANGLE
的源渲染到帧缓冲区,然后取消绑定帧缓冲区并渲染到 canvas?
我对 WebGL 了解不多,我正在尝试编写 https://github.com/kutuluk/js13k-2d 的无状态版本(只使用 draw() 调用保持状态的精灵,因为我会有数百万个精灵)。在我深入杂草之前,我希望得到一些反馈。
没有通用的最快方法。最快的方法因GPU而异,也因具体情况而异。
- 你画了很多一样大小的东西吗?
- 纹理图集的各个部分是否大小相同?
- 您会旋转或缩放每个实例吗?
- 他们的运动能否仅基于时间?
- 他们的绘画顺序会改变吗?
- 纹理有透明度吗?
- 透明度是否为 100%(0 或 1)或介于两者之间的各种值?
我敢肯定还有很多其他的考虑因素。对于每一个考虑,我可能会选择不同的方法。
总的来说,您的想法如果使用 drawElementsAngleInstanced
似乎不错,但不知道您要做什么以及在哪种设备上很难知道。
如果您有一个单一的二次方 width/height 纹理(例如 2048)并且您希望尽快将其缩放和平移的子集(例如按比例缩小的 64x92 大小的图块)blit 掉到另一个纹理上(作为缓冲区,以便在不脏时可以缓存),然后将该纹理绘制到 webgl canvas,你没有更多的要求 - 最快的策略是什么?
是否首先加载源纹理,将空纹理绑定到帧缓冲区,将带有 drawElementsInstancedANGLE
的源渲染到帧缓冲区,然后取消绑定帧缓冲区并渲染到 canvas?
我对 WebGL 了解不多,我正在尝试编写 https://github.com/kutuluk/js13k-2d 的无状态版本(只使用 draw() 调用保持状态的精灵,因为我会有数百万个精灵)。在我深入杂草之前,我希望得到一些反馈。
没有通用的最快方法。最快的方法因GPU而异,也因具体情况而异。
- 你画了很多一样大小的东西吗?
- 纹理图集的各个部分是否大小相同?
- 您会旋转或缩放每个实例吗?
- 他们的运动能否仅基于时间?
- 他们的绘画顺序会改变吗?
- 纹理有透明度吗?
- 透明度是否为 100%(0 或 1)或介于两者之间的各种值?
我敢肯定还有很多其他的考虑因素。对于每一个考虑,我可能会选择不同的方法。
总的来说,您的想法如果使用 drawElementsAngleInstanced
似乎不错,但不知道您要做什么以及在哪种设备上很难知道。