MSDN文档解析:https://docs.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl-if
UNITY_BRANCH:GPU会先执行if表达式里的条件,若条件返回true,则后续仅执行true对应的那一段代码。但会打乱执行顺序,不适合并行处理。
UNITY_FLATTEN:GPU会执行所有分支的代码,在后面才通过if表达式里的条件来选取其中一个分支的结果。更适合于并行处理。
这两个宏只在HLSL里生效。
如果什么都不标记的话编译器会按自己的判断选择其中之一,然而不是每个平台每个版本的编译器都足够聪明,开发中最好可以进行手动指定。
如何选择:
大多数时候,您都希望进行分支,但是对于特别便宜的计算,分支本身可能比仅做这两种分支都要昂贵。在现代的AMD“ GCN” GPU(过去6年中的任何一种)上,动态分支本身要花费6条指令,因此,if语句可能要比在两个分支内的代码花费更高!现代着色器编译器非常了解要使用哪个选项,并且OpenGL甚至没有办法将一个选项强加于另一个,并且假定它会为您做出正确的选择(基本上总是分支),并且如果您想将其展平,请自己将其展平。一般来说,你不需要使用UNITY_BRANCH。
当分支代码计算量大的时候(多于六个指令)用UNITY_BRANCH会比较合适。若代码计算量都不大(少于六个指令),则用UNITY_FLATTEN会比较合适。