2013-09-29 54 views
1

即时通讯基本上试图提供关于对象的不同形状信息到用glsl编写的光线跟踪器。访问来自glsl着色器的自定义数据

形状像

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

box:vec3 center; vec3 halfSize;

的问题有以下要求:

  1. 在片段着色器可以访问所有的形状
  2. 不使用统一的变量,给他们的每一帧,不知何故缓存它们更长的时间直到手动移除。
  3. 能够从应用程序
  4. 数据是可变长度每种类型的更新数据(球,箱的计数,...)

数据没有被交织。

  • 所以统一变量发送太多的数据。似乎
  • 属性不被换货很多种对象(属性阵列使用一个位置上的每个元件)
  • 纹理改变数据不期望且难看访问形状信息

这样一个如何能做到这一点?

最好还具有代表数据的结构。像结构体Sphere {vec3 p; float r; }; ...

+0

一般来说,在片段着色器你将有机会获得的唯一途径“所有”的东西,如果你使用的纹理或最近(的OpenGL 4.2+)图像加载/存储的状态存储。计算着色器是一个非常适合这种事情,所以很高兴知道你所瞄准的是哪一代硬件G。 –

回答

1

您可以使用Uniform Buffer Objects,如果存储你所需要的量是不是太巨大。这些基本上都是使用glUniformBlockBinding绑定在一起而不是单独绑定的统一块。这样整个缓冲区就被写入一次,然后在每个着色器调用之前绑定。 UBO必须具有至少16KB的最大大小,所以你应该没问题,除非你有大量的基元/基元类型。 (请注意,数组必须是固定大小的,所以每当您更改基本数组的大小时,您都需要重新编译着色器,或者分配足够的数据以保存您将需要的最大数量。 ,你需要OpenGL 4.3和Shader Storage Buffer Objects,它们基本上是UBO,但更大,可以写入(读取和写入是不连贯的,因此在使用SSBO时需要使用相同的内存屏障,就像图像统一一样) 。