从glsl着色器访问自定义数据

时间:2013-09-29 22:15:28

标签: opengl glsl shader

我基本上试图向用glsl编写的光线跟踪器提供关于对象的不同形状信息。

形状如

sphere:vec3 center;浮动半径;

框:vec3中心; vec3 halfSize;

问题是以下要求:

    片段着色器中的
  1. 可以访问所有形状
  2. 不要使用统一变量每帧发送它们,以某种方式将它们缓存更长时间,直到手动删除。
  3. 能够从应用程序更新数据
  4. 数据的长度各不相同(球体,盒子数......)
  5. 数据不是交错的。

    • 所以统一变量会发送太多数据。
    • 属性似乎不适用于很多对象(属性数组使用每个元素的位置)
    • 纹理会不必要地更改数据并且难以访问形状信息

    那怎么能这样做呢?

    优选地还具有表示数据的结构。像struct Sphere {vec3 p;漂浮r; }; ...

1 个答案:

答案 0 :(得分:1)

如果您需要的存储量不是太大,您可以使用Uniform Buffer Objects。这些基本上都是制服块,它们都是用glUniformBlockBinding而不是单独绑定在一起的。这样整个缓冲区被写入一次,然后在每次着色器调用之前绑定。 UBO要求最大大小至少为16KB,所以除非你有大量的原语/原始类型,否则你应该没问题。 (请注意,数组必须是固定大小的,因此每次更改基本数组的大小时都需要重新编译着色器,或者分配足以保存您需要的最大数量。

否则,你需要OpenGL 4.3和Shader Storage Buffer Objects,它们基本上都是UBO但是更大并且可以写入(读写是不连贯的,因此在使用SSBO时你需要使用相同的内存屏障就像你想要的图像一样)。