【问题标题】:C++ - Buffer combining adding extra empty valuesC ++ - 缓冲区组合添加额外的空值
【发布时间】:2012-07-25 16:33:04
【问题描述】:

我正在尝试填充两个缓冲区,一个索引缓冲区对象和一个 C++ 中的顶点缓冲区对象。

// Create the IBO and VBO data
GLushort* iboData = new GLushort[polyProcessed * 3];
Vertex* vboData = new Vertex[vertProcessed];

int iboPos = 0;
int vboPos = 0;

// Create the VBO and IBO
for(int i = 0; i < fragMap[0x36]; i++)
{
    // Copy the data to the IBO
    memcpy(iboData + iboPos, zmeshes[i].indices, zmeshes[i].numPoly * 3 * sizeof(GLushort));//sizeof(*zmeshes[i].indices));

    // Advance the position
    iboPos += zmeshes[i].numPoly * 3 * sizeof(GLshort);

    // Copy the data to the VBO
    memcpy(vboData + vboPos, zmeshes[i].vertices, zmeshes[i].numVert * sizeof(Vertex));//sizeof(*zmeshes[i].vertices));

    // Advance the position
    vboPos += zmeshes[i].numVert * sizeof(Vertex);

    errorLog.writeSuccess("Build log: VBO size %i VBO pos %i IBO size %i IBO pos %i", zmeshes[i].numVert * sizeof(Vertex), 
                          vboPos, zmeshes[i].numPoly * 3 * sizeof(GLshort), iboPos);
}

它只是获取要复制的数据的大小,复制它,然后推进位置(将下一个数据放入缓冲区的位置)。

我得到这样的输出:

<---> Index dump: 0
<---> Index dump: 1
<---> Index dump: 2
<---> Index dump: 2
<---> Index dump: 3
<---> Index dump: 0
<---> Index dump: 4
<---> Index dump: 5
<---> Index dump: 23
<---> Index dump: 23
<---> Index dump: 22
<---> Index dump: 4
<---> Index dump: 26
<---> Index dump: 6
<---> Index dump: 7
<---> Index dump: 7
<---> Index dump: 8
<---> Index dump: 26
<---> Index dump: 9
<---> Index dump: 34
<---> Index dump: 10
<---> Index dump: 10
<---> Index dump: 11
<---> Index dump: 9
<---> Index dump: 12
<---> Index dump: 25
<---> Index dump: 13
<---> Index dump: 13
<---> Index dump: 14
<---> Index dump: 12
<---> Index dump: 13
<---> Index dump: 25
<---> Index dump: 31
<---> Index dump: 31
<---> Index dump: 15
<---> Index dump: 13
<---> Index dump: 28
<---> Index dump: 33
<---> Index dump: 16
<---> Index dump: 36
<---> Index dump: 33
<---> Index dump: 35
<---> Index dump: 31
<---> Index dump: 24
<---> Index dump: 15
<---> Index dump: 17
<---> Index dump: 25
<---> Index dump: 18
<---> Index dump: 18
<---> Index dump: 25
<---> Index dump: 12
<---> Index dump: 27
<---> Index dump: 34
<---> Index dump: 9
<---> Index dump: 2
<---> Index dump: 1
<---> Index dump: 19
<---> Index dump: 30
<---> Index dump: 32
<---> Index dump: 20
<---> Index dump: 29
<---> Index dump: 25
<---> Index dump: 17
<---> Index dump: 17
<---> Index dump: 21
<---> Index dump: 29
<---> Index dump: 32
<---> Index dump: 26
<---> Index dump: 8
<---> Index dump: 8
<---> Index dump: 20
<---> Index dump: 32
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0

这可以看作是复制了正确的 72 个值,并在其后面复制了 72 个 0。我是否在复制缓冲区时做错了什么,或者这是否表明其他地方有问题?

进一步解释:

网格 1 - 72 个索引 网格 2 - 300 个索引 网格 3 - 45 个索引。

使用上面的函数,它会产生一个缓冲区来做这个:

[0]-[71] - 网格 1 顶点全部正确 [72]-[142] - 空 [142]-[EndofBuffer] - 网格 2

它会创建用 0 填充的重复大小。

【问题讨论】:

  • 你说应该只有72个值。你确定 fragMap[0x36] 在这个循环中是 72 吗?如果它大于zmeshes 中的元素数量,它将读取zmeshes 的末尾并将垃圾值写入iboDatavboData。或者,生成该索引转储的代码可能是循环太多次的代码。我会在上面的循环和生成索引转储的循环中检查循环条件的值,并确认它们都与您尝试从 zmeshes 复制的元素数量相匹配。
  • @JoshTownzen fragMap 是一个保留片段数量的地图。我在寻找 0x36 片段。问题在于,每次我在缓冲区中复制时,它都会将其复制到“x”位置,而 x 是前一个缓冲区的大小。我更新了我的帖子以更清晰。
  • 只是为了确认一下,当您说“我在寻找 0x36 片段”时,您的意思是您正在寻找与 fragMap 的元素 0x36 中列出的一样多的片段吗?如果是这样,我仍然建议调试 fragMap[0x36] 的值,以确保它包含您要查找的数字。相反,如果您的意思是您正在寻找文字 0x36 片段(54,十进制),那么上面的循环将不会这样做。
  • @JoshTownzen 没错。它返回 0x36 片段的数量。在这种情况下,0x36 是在我的地图中返回 0x36 类型片段数量的类型。我解决了这个问题。解决方案如下

标签: c++ buffer memcpy


【解决方案1】:

由于iboDataGLushort*,那么iboData+iboPos实际上指向内存位置(int)iboData + iboPos * sizeof(GLushort)。您将字节偏移量与数组偏移量混淆了。在您的两个+= 语句中,不要乘以您在memcpy 中使用的sizeof,因为iboPos 记录的是GLushort 偏移量,而不是字节偏移量。

【讨论】:

    【解决方案2】:

    Keith Randall 有正确的解决方案。我把两者搞混了。这是我最终做的:

    // Create the VBO and IBO
        for(int i = 0; i < fragMap[0x36]; i++)
        {
            // Copy the data to the IBO
            memcpy(&iboData[iboPos], zmeshes[i].indices, zmeshes[i].numPoly * 3 * sizeof(GLushort));//sizeof(*zmeshes[i].indices));
    
            // Advance the position
            iboPos += zmeshes[i].numPoly * 3;
    
            // Copy the data to the VBO
            memcpy(&vboData[vboPos], zmeshes[i].vertices, zmeshes[i].numVert * sizeof(Vertex));//sizeof(*zmeshes[i].vertices));
    
            // Advance the position
            vboPos += zmeshes[i].numVert;
    
            errorLog.writeSuccess("Build log: VBO size %i VBO pos %i IBO size %i IBO pos %i", zmeshes[i].numVert * sizeof(Vertex), 
                                  vboPos, zmeshes[i].numPoly * 3 * sizeof(GLshort), iboPos);
        }
    

    我想要数组中的偏移量。不是缓冲区的偏移量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2017-09-19
      • 2014-05-30
      • 1970-01-01
      相关资源
      最近更新 更多