刚刚解决了一个特别坑的问题。

客户有个需求 需要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__)

万事大吉

05-07 15:26