2012-07-27 4 views
0

C++에서 버퍼, 인덱스 버퍼 객체 및 버텍스 버퍼 객체 두 개를 채우려고합니다.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); 
} 

는 단순히 데이터의 크기를 복사 할 점점을 복사 한 다음 (여기서 버퍼에 다음 데이터를 입력하는 방법)의 위치를 ​​전진하는 것.

나는 출력과 같이 얻을 : 올바른 (72 개) 값이 복사되고, 72 공의가 배후에서 복사로

<---> 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 

이 볼 수 있습니다. 내 버퍼를 복사하는 데 문제가 있었습니까? 아니면 다른 곳에서 문제가 있다는 뜻입니까?

추가의 설명 :

1 개 메쉬 - 72 메쉬 인덱스 2 - 300 메쉬 인덱스 3-45 인덱스. 위의 함수를 사용

, 이것이 수행 버퍼 생성 : - [71] -

[0] 1 개 개의 정점을 메쉬 모든 정확한 [72] - [142] - 빈 [142] - [ EndofBuffer] - 메쉬 2

0으로 채워진 크기가 중복 생성됩니다.

+0

당신은 72 개의 값만 있어야한다고 말합니다. 이 루프 동안'fragMap [0x36]'이 72인지 확신합니까? 'zmeshes'의 요소 수보다 크면'zmeshes'의 끝을지나 읽고'iboData'와'vboData'에 정크 값을 씁니다. 또는 인덱스 덤프를 생성 한 코드가 너무 반복적으로 반복 될 수 있습니다. 위의 루프와 인덱스 덤프를 생성하는 루프의 루프 조건 값을 확인하고 둘 다'zmeshes'에서 복사하려는 요소의 수와 일치하는지 확인합니다. –

+0

@JoshTownzen fragMap은 조각의 수를 유지하는지도입니다. 0x36 조각을 찾고있었습니다. 문제는 버퍼에 복사 할 때마다 이전의 버퍼 크기 인 x 위치에서 'x'자리에 복사한다는 것입니다. 내 게시물을 더 명확하게 업데이트했습니다. –

+0

"0x36 조각을 찾고있다"고 말할 때, 'fragMap'의 0x36 요소에 나열된만큼의 조각을 찾고 있다는 것을 확인해 주시겠습니까? 그렇다면'fragMap [0x36]'의 값을 디버깅하여 원하는 숫자가 포함되도록 할 것을 제안합니다. 대신에 당신이 문자 0x36 조각 (십진수로 54)을 찾고 있다는 것을 의미한다면, 그것은 위의 루프가 할 일이 아닙니다. –

답변

3

iboDataGLushort*이므로 iboData+iboPos은 실제로 메모리 위치 (int)iboData + iboPos * sizeof(GLushort)을 가리 킵니다. 바이트 오프셋을 배열 오프셋과 혼동하고 있습니다. 두 개의 += 문에 memcpy에 사용 된 sizeof을 곱하지 마십시오. iboPos은 오프셋 오프셋이 아니라 GLushort 개를 기록합니다.

+0

입니다. 당신이 맞습니다. 아래에 해결책을 게시했습니다. 고맙습니다. –

0

키스 랜돌 (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); 
    } 

배열로 오프셋을 원했습니다. 버퍼로의 오프셋이 아닙니다.