关于HLSL程序运行的一些问题
我的HLSL代码,在运行的时候不按我写的顺序运行,甚至我写的有些代码没有运行到.请高手指点
比如
if(a==0)
{
b=float4(1.0f,1.0f,1.0f,1.0f);
}
在反汇编的时候,会发现先运行 b=float4(1.0f,1.0f,1.0f,1.0f);之后再进行判断.请高手指点下,如何让HLSL按照自己设定的顺序运行.
[解决办法]
低版本 shader编译器对对流程控制语句支持不好。
[解决办法]
应该是GPU没提供分支跳转。
如果有这种分支语句而GPU不支持分支跳转,一般处理是把所有分支都算出来,然后用一些小技巧只保留有用的结果而丢弃其他的。
GPU不是CPU,要写出高效的shader还是应该尽量符合GPU的规范。
另外分支和循环基本上可以算作一回事,一般在最底层的汇编这一级,循环就是靠分支和跳转实现的。
[解决办法]
我以前写shader的时候都是用汇编的,估计HLSL考虑到并行性效率什么的,自己做了某些优化了吧,谁让GPU限制多呢?如果执行结果是一致的话,就算跑的乱点也……忍了吧。
[解决办法]
1 ps3.0才是真正的动态流控制。低版本(2.x)都是假的,用cmp模拟实现的
2 即使使用ps3,也要注意一些问题
详情请看
http://blog.csdn.net/cywater2000/archive/2007/01/27/1495655.aspx
[解决办法]
就像楼上那个人说的,我记得有本书也说过,低版本的shader是把程序展开的,所以。。