【发布时间】:2018-08-29 00:48:28
【问题描述】:
在this question about growing buffers,有人用以下代码回答。
// Bind the old buffer to `GL_COPY_READ_BUFFER`
glBindBuffer (GL_COPY_READ_BUFFER, old_buffer);
// Allocate data for a new buffer
glGenBuffers (1, &new_buffer);
glBindBuffer (GL_COPY_WRITE_BUFFER, new_buffer);
glBufferData (GL_COPY_WRITE_BUFFER, ...);
// Copy `old_buffer_size`-bytes of data from `GL_COPY_READ_BUFFER`
// to `GL_COPY_WRITE_BUFFER` beginning at 0.
glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, old_buffer_size);
这是我对上面的理解,为了复制A到B:
Bind A
Generate B
Bind B
Write null contents to B at larger size
Copy A to B
我的问题是 A 是着色器的原始顶点缓冲区,但 B 也是(因为改变大小是目标)。在我的代码(C# opentk)中,着色器告诉我缓冲区的 ID 与使用 GL.GetActiveAttrib 的命名着色器变量一致,我找不到如何使它使用与它提供的缓冲区不同的缓冲区。
所以我要么必须重新分配着色器以在之后使用 B,要么进行双重复制:
Bind A
Generate B
Bind B
Write null contents to B at larger size
Copy A to B
Reassign shader to use B
Write null contents to A at larger size (size of B)
Copy B to A
是否可以让它使用特定的缓冲区或避免重复复制?
【问题讨论】:
-
waht 有
GetActiveAttrib与任何缓冲区对象名称有关。着色器不关心缓冲区,只关心属性。所以最简单的方法就是相应地更新属性指针。