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

时间:2019-09-18 13:54:33

标签: unity3d hlsl shaderlab

我正在尝试做类似的事情

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)

它记录了一个错误FROM docker.elastic.co/kibana/kibana:7.3.1 # custom favicons COPY favicons/* /usr/share/kibana/src/legacy/ui/public/assets/favicons/ COPY logo_small.svg /usr/share/kibana/node_modules/@elastic/eui/src/components/icon/assets/logo_kibana.svg COPY logo_small.svg /usr/share/kibana/node_modules/@elastic/eui/lib/components/icon/assets/logo_kibana.svg # custom throbber RUN sed -i 's/Loading Kibana/Loading New Kibana/g' /usr/share/kibana/src/legacy/ui/ui_render/views/ui_app.pug # NOT WORKING inline replacement and variable definition COPY logo.b64.txt /tmp/logo.b64.txt RUN export VAR=$(cat /tmp/logo.b64.txt); sed -i 's/image\/svg+xml.*");/image\/svg+xml;base64,$VAR");/g' /usr/share/kibana/src/legacy/ui/ui_render/views/ui_app.pug /usr/share/kibana/src/legacy/ui/ui_render/views/chrome.pug 因此,现在我有两种选择,一种是添加[unroll(100)]以限制循环时间,另一种是使用tex2Dlod而不是tex2D。

我很好奇为什么会这样?

此外,为什么可以在循环中使用tex2Dlod?

1 个答案:

答案 0 :(得分:2)

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

您的循环不会为相邻片段对tex2D进行相同数量的调用,因此无法预测地计算导数。

有关更多详细信息,请查看GLSL specs。搜索“导数”和“统一控制流”