1

如果我的顶点数据被布置

例子:

struct Vertex
{
   float position[4];
   float normal[3];
   float texCoord[2];
}

我知道我们使用

    glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_uiVertBufferHandle );

    //get the pointer position where we can add verts
    void* pPositionBuffer = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_READ_WRITE );

    //now copy into our memory spot
    //which we need to move to the right position
    memcpy( ((char*)pPositionBuffer) + ( uiVertLocation*sizeof(VertexFormat) ), pVerts, iNumVerts*sizeof(VertexFormat));

    //now stop mapping
    glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);

对于完整的复制位置,这是我一直在做的,但我只需要编辑顶点的位置数据而不更改任何其他属性

我只是在更新 cpu 端的位置数据以进行一些测试

struct Vertex
{
   float position[4]; <----
   float normal[3];
   float texCoord[2];
}
4

2 回答 2

1

映射缓冲区后,您可以像使用程序中的任何其他内存一样使用它的内存。例如,您可以只编写以下代码:

Vertex *cur_vertex = (Vertex *)pPositionBuffer + uiVertLocation;
for (int i = 0; i < iNumVerts; i++)
  cur_vertex[i]->position = pVerts[i]->position;

代替memcpy

于 2014-02-02T20:36:53.377 回答
1

您可以通过首先存储所有顶点,然后是所有法线,然后是所有纹理坐标来重新排列缓冲区中的数据。然后只使用glMapBufferRange和映射包含顶点的部分,并仅更新该部分。

于 2014-02-02T20:33:00.890 回答