Unity Compute Shader输出异常:预期红色纹理却得到蓝色
问题原因及解决办法
你的问题出在全局变量Iterations的初始化方式和HLSL的编译规则上:
在Unity Compute Shader基于的HLSL中,普通全局变量的初始值是未定义的——编译器不会保证它会被设置成你写的
1000。也就是说,Iterations实际是个随机的垃圾值,大概率小于0,导致循环条件i < Iterations直接不成立,循环根本没执行,就跳到了后面的蓝色赋值。另外你加的
[unroll(1000)]指令需要循环迭代次数是编译期常量,而普通全局变量不是常量,这个unroll指令会被编译器直接忽略,起不到任何作用。
修复代码
把Iterations改成常量即可:
const int Iterations = 1000; [numthreads(8,8,1)] void CSMain (uint3 id : SV_DispatchThreadID) { // 因为Iterations是常量,编译器会自动优化,unroll可以加也可以不加 for (int i = 0; i < Iterations; i++) { Result[id.xy] = float4(1, 0, 0, 1.0); return; } Result[id.xy] = float4(0, 0, 1, 1.0); }
改完之后,Iterations的值会被编译器确定为1000,循环条件成立,第一次循环就会执行return,输出全红色纹理。
内容的提问来源于stack exchange,提问作者Cake
相关产品推荐
相关产品推荐

