gpt4 book ai didi

c++ - 如何将圆形数组而不是常规数组传递给 OpenGL 函数?

转载 作者:行者123 更新时间:2023-11-30 04:04:43 27 4
gpt4 key购买 nike

在我的绘制方法(每帧执行)中,我需要将顶点坐标数组传递给 openGl。

glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);

每一帧,所有顶点都会重新计算,即使只有少数顶点发生变化。实际上,所有顶点都向左移动了几个数组位置(删除了最小数组索引中的顶点,并在数组末尾添加了新值)。

例如,数组值可以在迭代之间改变如下:

Iteration 1 : {0,1,2,3,4,5,6,7,8}
Iteration 2 : {4,5,6,7,8,9,10,11,12}

我不想再次重新计算所有值(即使是不变的值),而是只想计算新值,并将它们添加到循环数组的“末尾”。 (我知道该怎么做)。

我想知道是否可以通过某种方式将循环缓冲区/数组而不是常规数组传递给 openGl?有什么方法可以有效地做同样的事情,这样我就不必在每一帧都重新计算所有值了吗?

最佳答案

您可以使用元素数组,然后使用索引渲染(使用glDrawElement* 方法)

如果你不想这样做,那么你可以分两部分上传数组(buffer 是缓冲区的名称,array 是指向客户端数组,diff是循环数组中周转的偏移量,length是缓冲区的大小)

glBindBuffer(GL_ARRAY_BUFFER, buffer);
//copies the second part of the array to the first section of the buffer
glBufferSubData(GL_ARRAY_BUFFER, 0, length-diff, array+diff);
//copies the first part of the array to the second section of the buffer
glBufferSubData(GL_ARRAY_BUFFER, length-diff, diff, array);
glBindBuffer(GL_ARRAY_BUFFER,0);

或映射缓冲区并执行 memmove(因为它们可能重叠):这可能会使 glMapBuffer 上的管道停止运行

glBindBuffer(GL_ARRAY_BUFFER, buffer);
do{
void* buff = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
memmove(buff+diff, buff, length-diff);
//add new data
}while(glUnmapbuffer(GL_ARRAY_BUFFER)==GL_FALSE);
glBindBuffer(GL_ARRAY_BUFFER,0);

使用第二个缓冲区,您可以执行 glCopyBufferSubData 来执行服务器端的移动:

glBindBuffer(GL_COPY_READ_BUFFER​, frontbuffer);
glBindBuffer(GL_COPY_WRITE_BUFFER​, backbuffer);
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, diff, 0, length-diff);
glBindBuffer(GL_COPY_READ_BUFFER,0​);
glBindBuffer(GL_COPY_WRITE_BUFFER​,0);
swap(frontbuffer, backbuffer);

如果你分配的缓冲区是你需要的两倍大,最后一个也可以用一个缓冲区。

所以缓冲区的第一次迭代(* 是你不渲染的值)

1,2,3,4,5,6,7,8,*,*,*,*,*,*,*,*

第二次迭代:

*,*,*,*,5,6,7,8,9,10,11,12,*,*,*,*

口渴迭代:

*,*,*,*,*,*,*,*,9,10,11,12,13,14,15,16

所以你可以执行 glCopyBufferSubData(GL_ARRAY_BUFFER, GL_ARRAY_BUFFER, 8,0,8); 并制作它

9,10,11,12,13,14,15,16,*,*,*,*,*,*,*,*

关于c++ - 如何将圆形数组而不是常规数组传递给 OpenGL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23626508/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com