WebGL:什么更快?
WebGL: What is faster?
WebGL 中什么更快?
一次:
为 1000 个对象创建 1000 个着色器并为它们设置制服
每帧:
渲染时绑定着色器
或者
一次:
为 1000 个对象创建 10 个着色器
每帧:
绑定着色器 + 根据对象更新制服?
我知道我可以在上面写测试。但我觉得肯定有人在我之前考虑过这个问题。非常感谢你。
更改着色器很昂贵(它会使指令缓存无效),更新制服很便宜(它只更新寄存器文件中的值)。
记住 Graphics Pipeline 是通常在硬件中实现的实际管道会很有帮助。您可以通过分配着色器和设置制服来配置管道,然后您可以激活管道(通过调用 drawElements
或其朋友之一)。这实质上是将一堆输入数据加载到管道的开头,并启动了一个高度并行的过程。例如,在 运行 的中间,一些早期的顶点将通过顶点着色器和光栅化器,并且生成的片段正在被着色,而其他顶点仍在顶点着色器阶段被转换。管道的不同部分都在处理流过的数据。
启动此过程后,CPU 可以在管道 运行 的同时自由地做其他事情。但是,如果您想重新配置管道,例如通过更改着色器或更改制服,CPU 将阻塞您的线程并等待管道完全完成最后一个像素。
这意味着您希望尽可能避免停止和重新启动管道。所以通常的策略是批处理:在一次绘制调用中使用一组制服尽可能多地完成工作。这样,您就可以在您的应用中最大程度地利用管道的并行特性。
WebGL 中什么更快?
一次: 为 1000 个对象创建 1000 个着色器并为它们设置制服
每帧: 渲染时绑定着色器
或者
一次: 为 1000 个对象创建 10 个着色器
每帧: 绑定着色器 + 根据对象更新制服?
我知道我可以在上面写测试。但我觉得肯定有人在我之前考虑过这个问题。非常感谢你。
更改着色器很昂贵(它会使指令缓存无效),更新制服很便宜(它只更新寄存器文件中的值)。
记住 Graphics Pipeline 是通常在硬件中实现的实际管道会很有帮助。您可以通过分配着色器和设置制服来配置管道,然后您可以激活管道(通过调用 drawElements
或其朋友之一)。这实质上是将一堆输入数据加载到管道的开头,并启动了一个高度并行的过程。例如,在 运行 的中间,一些早期的顶点将通过顶点着色器和光栅化器,并且生成的片段正在被着色,而其他顶点仍在顶点着色器阶段被转换。管道的不同部分都在处理流过的数据。
启动此过程后,CPU 可以在管道 运行 的同时自由地做其他事情。但是,如果您想重新配置管道,例如通过更改着色器或更改制服,CPU 将阻塞您的线程并等待管道完全完成最后一个像素。
这意味着您希望尽可能避免停止和重新启动管道。所以通常的策略是批处理:在一次绘制调用中使用一组制服尽可能多地完成工作。这样,您就可以在您的应用中最大程度地利用管道的并行特性。