我有一个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时,我如何得到正确的数字呢?
1条答案
按热度按时间u4dcyp6a1#
请参阅Unsafe code, pointer types, and function pointers。使用
unsafe struct
和fixed
大小的数组,例如:使用marshalling和Marshal.StructureToPtr将数据从Managed对象封送行程至Unmanaged内存区块:
第一个