ShaderModel3里面的if真是让我有些小意外。
Attribute&默认情况
dx sdk里面提到if可以有两个[attribute]可以用:
float result;if(k){ result = 1.0f;}else{ result = 2.0f;}
或者:
float result;[flatten]if(k){ result = 1.0f;}else{ result = 2.0f;}//code after compilationfloat result1 = 1.0f;float result2 = 2.0f;cmp result k result1 result2
对于比较简单的if,shader里默认的是使用[flatten]这样的,因为毕竟branch非常破坏并行性。
但是自己写了很大的代码块在if和else端,结果是默认情况下仍旧是用[flatten]模式。
这个就是有点费解,或许compiler需要更加明显的信息或者编译提示才会使用挑战来避免掉大量的计算。
intrinsic指令
开始时候我还以为使用intrinsic指令会更快,类似step这样的来避免使用if。
但是实际情况是step这样的指令内部编译的时候仍旧是会成为cmp这样的汇编指令。
相反使用step,要做额外操作,反而没有直接if来的直接。
简而言之,不要有太多假设,一切以编出来的汇编代码和profile工具为基准。
另外一个比较搞笑的就是在使用gaussian blur的时候H pass和V pass唯一的不同就是kernel不一样。
这种不一样差别真的很小,就是一个是[0,1]这样的,一个是[1,0]这样的
结果编译结果出来居然差了8条指令,这。。。
很奇怪呃。
原文链接: