统一块的动态数量

时间:2011-01-16 22:44:56

标签: opengl glsl

运行openGL 3.1,问题很简单。

从GLSL站点,以下是如何定义统一缓冲区块的数组:

uniform BlockName
{
  vec3 blockMember1, blockMember2;
  float blockMember3;
} multiBlocks[3];

现在,是否可以拥有这些multiBlocks的动态数量? GLSL中没有指针,所以没有" new"声明等。

如果没有,是否有其他方法可以发送动态数量的元素? 我的街区目前正在包装四个花车和一个vec2。

我还没有写过着色器,所以你可以提出任何建议,谢谢;)

2 个答案:

答案 0 :(得分:1)

您不能拥有动态数量,也不能拥有动态索引。这意味着即使您可以动态更改计数,它也没什么用处,因为您仍然需要更改着色器代码才能访问新元素。

一种可能的替代方法是使块成员数组:

#define BLOCK_COUNT %d

uniform BlockName
{
    vec3 blockMember1[BLOCK_COUNT];
    vec3 blockMember2[BLOCK_COUNT];
    float blockMember3[BLOCK_COUNT];
}
multiBlocks;

然后你可以改变BLOCK_COUNT来改变成员数量,你可以使用动态索引:

multiBlocks.blockMember2[i];

但是,如果不重新编译着色器,它仍然不允许您更改元素的数量。

答案 1 :(得分:1)

好的,所以我也写了openGL论坛和this came out

所以基本上你有3个解决方案: 统一缓冲区对象或纹理缓冲区或具有大量准备元素的静态数组,并使用另一个统一指定实际大小。

可以使用OneSadCookie在编译时定义最大大小来升级最后一个。