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