我能否在OpenGL中拥有两个指向同一块的统一缓冲区?

3

我是OpenGL的新手。 我正在尝试更新一个常量块中的一些变量。 例如,我有一个块,如下所示(从opengl learnopengl.com复制):

layout (std140) uniform ExampleBlock
{
                 // base alignment  // aligned offset
float value;     // 4               // 0 
vec3 vector;     // 16              // 16  (offset must be multiple of 16 so 4->16)
mat4 matrix;     // 16              // 32  (column 0)
                 // 16              // 48  (column 1)
                 // 16              // 64  (column 2)
                 // 16              // 80  (column 3)
float values[3]; // 16              // 96  (values[0])
                 // 16              // 112 (values[1])
                 // 16              // 128 (values[2])
bool boolean;    // 4               // 144
int integer;     // 4               // 148
};

我能否有两个缓冲区,并使用glBindBufferRange仅更新其中一些值?其中一些块中的变量在初始化后将不会改变。因此,我将为其创建一个不可变缓冲区。然后我将创建一个动态缓冲区来打包所有剩余变量(每帧变化的变量)。

我现在面临的问题是,我尝试使用glBindBufferRange将变量绑定到不同的插槽。但它只支持256字节的倍数偏移。

我的方法可行吗?

1个回答

2
您想要的是不可能的。单个接口块只能由单个缓冲区提供服务。 glBindBufferRange 方法的偏移量是缓冲区内存中的偏移量,它描述了接口块中第一个变量开始读取的位置。 它不是接口块的偏移量。
您问题的明显解决方案是将接口块分成两个块,一个用于不可变的内容,另一个用于动态内容。

谢谢。我正在尝试另一种方法。我正在使用glMapBufferRange更新动态部分。我很惊讶glMapBufferRange非常快,但有时UnMap非常慢。我不知道发生了什么。 - TIANLUN ZHU
@TIANLUNZHU 你也可以研究一下持久映射缓冲区。如果我没记错的话,你可以同步缓冲区的部分而不必下载或上传整个数据。 - BDL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接