为什么我不能在 Unity ShaderLab 的循环中使用 tex2D?

Why I can't use tex2D inside a loop in Unity ShaderLab?

我正在尝试做类似

的事情
   while (currentLayerDepth < currentDepth)
   {
       currentUV -= step;
       currentDepth = tex2D(_HeightTex,currentUV).a;
       currentLayerDepth += eachLayer;
   }

它记录了一个错误 Shader error in 'Unlit/CustomParallax': unable to unroll loop, loop does not appear to terminate in a timely manner (1024 iterations) at line 76 (on metal) 所以现在我有两个选择,一个是添加 [unroll(100)] 来限制循环时间,另一个是使用 tex2Dlod 而不是 tex2D.

很好奇为什么会这样?

另外,为什么tex2Dlod可以循环使用?

tex2D 必须计算局部导数以确定样本的正确 LOD。由于导数通常是如何计算的(作为相邻计算单元之间的差异),它们只能针对可预测的控制流进行计算。

您的循环不会按预期对相邻片段执行相同次数的 tex2D 调用,因此无法按预期计算导数。

有关详细信息,请查看 GLSL specs。搜索 "derivative" 和 "uniform control flow"