我基本上试图向用glsl编写的光线跟踪器提供关于对象的不同形状信息。
形状如
sphere:vec3 center;浮动半径;
框:vec3中心; vec3 halfSize;
等
问题是以下要求:
数据不是交错的。
那怎么能这样做呢?
优选地还具有表示数据的结构。像struct Sphere {vec3 p;漂浮r; }; ...
答案 0 :(得分:1)
如果您需要的存储量不是太大,您可以使用Uniform Buffer Objects。这些基本上都是制服块,它们都是用glUniformBlockBinding而不是单独绑定在一起的。这样整个缓冲区被写入一次,然后在每次着色器调用之前绑定。 UBO要求最大大小至少为16KB,所以除非你有大量的原语/原始类型,否则你应该没问题。 (请注意,数组必须是固定大小的,因此每次更改基本数组的大小时都需要重新编译着色器,或者分配足以保存您需要的最大数量。
否则,你需要OpenGL 4.3和Shader Storage Buffer Objects,它们基本上都是UBO但是更大并且可以写入(读写是不连贯的,因此在使用SSBO时你需要使用相同的内存屏障就像你想要的图像一样)。