WebGL:什么更快?

时间:2015-11-01 08:57:00

标签: opengl-es directx glsl webgl

WebGL的速度有多快?

一次:    为1000个对象创建1000个着色器并为其设置制服

每一帧:    渲染时绑定着色器

或者

一次:    为1000个对象创建10个着色器

每一帧:    绑定着色器+根据对象更新制服?

我知道我可以在上面写测试。但我觉得有人肯定在我面前考虑过这件事。非常感谢你。

2 个答案:

答案 0 :(得分:1)

更改着色器很昂贵(它使指令缓存无效),更新制服便宜(它只是更新寄存器文件中的值)。

答案 1 :(得分:1)

记住Graphics Pipeline是通常在硬件中实现的实际管道,这很有帮助。您可以通过分配着色器和设置制服来配置管道,然后激活管道(通过调用drawElements或其中一个朋友)。这基本上将一堆输入数据加载到管道的开头,并启动高度并行的进程。例如,在运行过程中,一些早期顶点将通过顶点着色器和光栅化器,并且生成的片段将被着色,而其他顶点仍然返回到正在变换的顶点着色器阶段。管道的不同部分都在为流动的数据做出贡献。

启动此过程后,CPU可以在管道运行时自由执行其他操作。但是,如果您想重新配置管道,例如更改着色器或更改制服,CPU将阻止您的线程并等待管道完全完成到最后一个像素。

这意味着您希望尽可能避免停止和重新启动管道。所以通常的策略是批处理:在一次绘制调用中尽可能多地完成工作,只需要一套制服。这样,您可以在应用程序中尽可能地利用管道的并行特性。

Pipeline image courtesy OpenGLInsights.com