我在WebGL片段着色器中进行光线跟踪,计划使用动态生成的片段着色器,其中包含场景中的对象。当我向场景中添加一个对象时,我将向片段着色器添加一些线条,因此它可能会变得非常大。它能变得多大并且仍在工作?它是否依赖于显卡?
答案 0 :(得分:2)
“安全”的答案是它取决于你的硬件和驱动程序,但实际上它们可能非常疯狂。 JustSid所说的关于性能的内容确实适用(更大的着色器==更慢的着色器),但听起来你并没有完全瞄准60FPS。
要更深入地分析着色器限制,请查看http://en.wikipedia.org/wiki/High_Level_Shader_Language。该页面是关于Direct X着色器的,但所有着色器约束也适用于GLSL。
答案 1 :(得分:1)
对着色器的大小有各种限制。这是驱动程序/ gpu,但它也取决于机器和WebGL。一些WebGL实现(chrome)运行内部计时器。如果单个GL命令花费的时间太长,他们将杀死WebGL(“老鼠,WebGL遇到障碍”)。当着色器编译时间过长时,可能会发生这种情况。
以下是愚蠢 100k着色器的示例,其中我通过脚本运行模型以在着色器本身中生成网格。它在Macbook Pro上的macOS上运行。它也可以在我的iPhone6 +上运行。但是当我在Windows中尝试时,DirectX驱动程序需要花费太长的时间来尝试优化它并且Chrome会杀死它。
在你的着色器中放置几何图形很有趣,使用带符号的距离场和射线行进类型的东西很有趣,但这些技术更像是一个拼图/玩具。 他们没有任何表现。一个典型的示例this SDF based shader在我的笔记本电脑上以每秒大约1帧的速度运行,但我的笔记本电脑能够以合理的帧速率显示all of Los Santos from GTV5。
如果你想要性能,你应该使用更多标准技术,将几何体放在缓冲区中并进行前向或延迟渲染。
答案 2 :(得分:0)
您不希望创建大量片段着色器,因为它们往往会非常快地耗尽性能。如果可能,您应该在CPU或顶点着色器中进行任何计算,但不应对每个像素进行任何计算。