运行openGL 3.1,问题很简单。
从GLSL站点,以下是如何定义统一缓冲区块的数组:
uniform BlockName
{
vec3 blockMember1, blockMember2;
float blockMember3;
} multiBlocks[3];
现在,是否可以拥有这些multiBlocks的动态数量? GLSL中没有指针,所以没有" new"声明等。
如果没有,是否有其他方法可以发送动态数量的元素? 我的街区目前正在包装四个花车和一个vec2。
我还没有写过着色器,所以你可以提出任何建议,谢谢;)
答案 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在编译时定义最大大小来升级最后一个。