【问题标题】:one int variable works as an array index but another one doesn't一个 int 变量用作数组索引,但另一个不用作
【发布时间】:2021-03-31 13:34:28
【问题描述】:

我正在统一开发一个行进立方体计算着色器,在某些时候我需要找到一个索引,以便我可以通过连接这些边来制作顶点这是代码

uint cubeIndex = 0;

for (int i = 0; i < 8; i++)
{
    if (cube[i].isInside == 1)
    {
        cubeIndex |= 1 << i;
    }
}

    return cubeIndex;

问题是当我使用“cubeIndex”作为数组索引时,它给了我这个错误: 程序“CSMain”,错误 X4505:临时寄存器和可索引临时寄存器的总和超出内核 CSMain 的 4096 的限制。

如果将数组索引更改为任何其他 int,则代码有效!

这是我的主要内核

 uint myCubeIndex = CubeInit(cube);
Edges midPoints = CalMidPoints(cube);

int edge = triTable[myCubeIndex][0];

float3 position = midPoints.midPoints[edge];

vertexArray.Append(position);

【问题讨论】:

    标签: hlsl marching-cubes


    【解决方案1】:

    我相信单位的位移要么进入负数,要么给你溢出。或!!

    How to use a huge array in HLSL (error X4505)

    这个问题,因为这里的某个人还试图在 hlsl 着色器中放置太多顶点,试图使行进立方体工作,并且需要将其限制为 4096

    【讨论】:

    • 我不明白它是如何变成负数的,循环最多只能将其左移 8 位,有什么我不知道的规则吗?
    • 在某些语言中,我不记得它是如何工作的,但这是基本概念。最左边的位代表符号,因此如果您达到 1|1111,1|0001 现在将是 +1,但再次移位它需要使用更大的比特大小,因此它将相应地添加 0,如 0011|1111 使最左边的数字成为0 代表负数。对不起,这不是一个很好的例子,因为我不记得确切的。我会说尝试 long unsigned int 但行进立方体仍然使用更大的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多