我正在尝试做一些事情,比如
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?
发布于 2019-09-18 22:38:47
tex2D必须计算局部导数来确定样本的正确详细程度。由于导数通常是如何计算的(作为相邻计算单元之间的差异),它们只能针对可预测的控制流进行计算。
您的循环不会对相邻片段执行相同数量的tex2D调用,因此无法可预测地计算导数。
有关更多详细信息,请查看GLSL specs。搜索“派生”和“统一控制流”
https://stackoverflow.com/questions/57994423
复制相似问题