我该如何修复我的代码中关于循环中数组引用的 HLSL 错误?
What can I do to fix my code with this HLSL error about array references in loops?
我有一个包含以下代码的 HLSL 文件:
struct particle
{
float2 pos;
float next_pos;
float angle;
};
particle nearby[32];
float angles[32];
for (uint i = 0; i < number_of_particles; i++)
{
if ((particle_buffer[i].pos.y <= pos.y + sight && particle_buffer[i].pos.y >= pos.y - sight) && (particle_buffer[i].pos.x <= pos.x + sight && particle_buffer[i].pos.x >= pos.x - sight))//is it within sight square
{
nearby[i] = particle_buffer[i];
count++;
}
if (count >= 32)
{
break;
}
}
for (uint j = 0; j < count; j++)
{
angles[j] = atan((pos.y - nearby[j].pos.y) / (pos.x - nearby[j].pos.x)); //angle in radians from current to next particle converted to degrees
}
和行:
nearby[i] = particle_buffer[i];
angles[j] = atan((pos.y - nearby[j].pos.y) / (pos.x - nearby[j].pos.x)); //angle in radians from current to next particle converted to degrees
关于 L 值和数组引用都抛出相同的错误:
Shader warning in 'hlsl_file': array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll at kernel move at hlsl_file.compute(line_num) (on d3d11)
我浏览了 Microsoft 文档和其他一些论坛,但我不理解很多解决方案,而且大多数答案都是针对顶点着色器的,而不是像我这样的计算着色器。我能做出的最好猜测是,这是因为数组在分配给另一个数组时不能接受不同的索引输入,但我一点也不确定。
编辑:
在统一论坛上进一步查看后,对于某些硬件,您可能会通过尝试使用不是循环变量(i 或 j)的索引变量来寻址循环内的数组来获得此错误,我的代码没有不要这样做,但也许它是相关的?
我最终只使用了 RWStructuredBuffer
而不是数组,一切都完美无缺。虽然不确定这是否有效。
我有一个包含以下代码的 HLSL 文件:
struct particle
{
float2 pos;
float next_pos;
float angle;
};
particle nearby[32];
float angles[32];
for (uint i = 0; i < number_of_particles; i++)
{
if ((particle_buffer[i].pos.y <= pos.y + sight && particle_buffer[i].pos.y >= pos.y - sight) && (particle_buffer[i].pos.x <= pos.x + sight && particle_buffer[i].pos.x >= pos.x - sight))//is it within sight square
{
nearby[i] = particle_buffer[i];
count++;
}
if (count >= 32)
{
break;
}
}
for (uint j = 0; j < count; j++)
{
angles[j] = atan((pos.y - nearby[j].pos.y) / (pos.x - nearby[j].pos.x)); //angle in radians from current to next particle converted to degrees
}
和行:
nearby[i] = particle_buffer[i];
angles[j] = atan((pos.y - nearby[j].pos.y) / (pos.x - nearby[j].pos.x)); //angle in radians from current to next particle converted to degrees
关于 L 值和数组引用都抛出相同的错误:
Shader warning in 'hlsl_file': array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll at kernel move at hlsl_file.compute(line_num) (on d3d11)
我浏览了 Microsoft 文档和其他一些论坛,但我不理解很多解决方案,而且大多数答案都是针对顶点着色器的,而不是像我这样的计算着色器。我能做出的最好猜测是,这是因为数组在分配给另一个数组时不能接受不同的索引输入,但我一点也不确定。
编辑: 在统一论坛上进一步查看后,对于某些硬件,您可能会通过尝试使用不是循环变量(i 或 j)的索引变量来寻址循环内的数组来获得此错误,我的代码没有不要这样做,但也许它是相关的?
我最终只使用了 RWStructuredBuffer
而不是数组,一切都完美无缺。虽然不确定这是否有效。