为什么我不能在 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"
我正在尝试做类似
的事情 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"