刚刚解决了一个特别坑的问题。
客户有个需求 需要shader里面 loop 的iterator数量 在运行时确定。z
这样对于里面存在 sample的loop就会被force unroll但因为count不确定 就没法unroll就编译不过了
我发现只有一个方法就是 关掉unroll
我试验了各种 在shader里面用预编译指令 关unroll 的方法
orbis 平台 #pragma unroll
#pragma loop(unroll: never)
(见文档 unroll)
d3d 平台
[fastopt]
https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwiI9Ye4y93KAhWHUqYKHWbgDokQFggiMAE&url=https%3A%2F%2Fmsdn.microsoft.com%2Fzh-cn%2Flibrary%2Fwindows%2Fdesktop%2Fbb509602(v%3Dvs.85).aspx&usg=AFQjCNG3yrRUDxW1nza1GkD4lzEC4D_XfA
什么的都是骗人的 ,以上这些在for(){}前面加的控制命令都不管用
在psslc的文档里我找到了更为bt的关闭方法 在调用psslc.exe的时候 用-nounroll-all-loops的方法
但是d3dcompiler那里编不过
这就要说到psslc的恶心策略了,一个shader要编两边
gnm平台 第一遍用d3dcompiler_47感觉是用 d3d的effect框架 把renderstate那出来
之后再用psslc编一次
这样就要求 写的一个shader在两个平台下都能过,可无论如何我也没有办法在d3d平台关掉强制unroll
后来,想到用编译指令在d3d平台把那句sample 注掉.....这样d3d就不会要求强制unroll了
因为只是提供renderstate的设置 所以这并不影响结果
#if define (PHYRE_D3DFX)
#if define (__ORBIS__)
万事大吉