2

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

形状像

球体:vec3中心;浮动半径;

盒子:vec3中心;vec3 半尺寸;

等等

问题是以下要求:

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

数据不交错。

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

那么如何做到这一点呢?

最好还具有表示数据的结构。像 struct Sphere { vec3 p; 浮动 r; }; ...

4

1 回答 1

2

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

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

于 2013-09-29T22:55:21.793 回答