opengl 同一SSBO中的vec3和int

zpf6vheq  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(157)

我有一个SSBO,它包含一个结构列表,其中包含整数和vec3,如下所示。我使用OpenTK进行C# opengl绑定。

struct BVHNode {
    vec3 AABBMin;
    int Child1;
    vec3 AABBMax;
    int Child2;
    int SplitAxis;
    int NumTriangles;
    int TriangleOffset;
    int ParentIndex;
};

layout(std430, binding=6) buffer BVHSSBO {
    BVHNode BVHNodes[];
} bvhSSBO;

缓冲区的填充方式如下:

var gpuNodes = new Vector4[...];
...
GL.NamedBufferStorage(_bvhBufferHandle, bvhBufferSize, IntPtr.Zero, BufferStorageMask.DynamicStorageBit);
GL.BindBufferRange(BufferTargetARB.ShaderStorageBuffer, 6, _bvhBufferHandle, IntPtr.Zero, bvhBufferSize);
GL.NamedBufferSubData(_bvhBufferHandle, IntPtr.Zero, bvhBufferSize, gpuNodes);

问题是这些整数被转换成浮点二进制表示,然后再转换回整数。屏幕截图中的数字应该等于1,但它的1065353216,二进制表示为111111100000000000000000000000,将其转换回十进制表示为IEE754浮点数,得到1.0

如果我在着色器中将这些数字的类型更改为float,这些数字是正确的,但当我想将它们用作数组的索引时,我每次都必须执行int(x)
唯一能让整数起作用的方法是把gpuNodes的类型从Vector4改为Vector4i,但这样vector3就不起作用了。当类型保持int时,我如何得到正确的数字呢?

u4dcyp6a

u4dcyp6a1#

请参阅Unsafe code, pointer types, and function pointers。使用unsafe structfixed大小的数组,例如:

public unsafe struct Buffer
{
    public fixed float floatData[4];
    public fixed int intData[4];
    // [...]
}

使用marshallingMarshal.StructureToPtr将数据从Managed对象封送行程至Unmanaged内存区块:
第一个

相关问题