2011-10-21 26 views
2

我想實現一個簡單的rendermanager。另一個類提供了表示四元組的結構,並將其複製到呈現管理器中的頂點數組緩衝區中。指針和opengl繪圖問題

但是,複製似乎並沒有工作,當我手動創建一個結構並複製到vertexarray一切都很好,它呈現。但在複製的某個地方,一切都會出錯。我可以看到使用gdb(值不同),但我無法弄清楚發生了什麼。

RenderManager方法

-(id)init 
{ 
    if([super init]){ 
     iva = calloc(MAX_QUADS, sizeof(quad)); 

     quad draw = { 
      0.0f,0.0f,0.0f,   0.0f,0.0f,1.0f, //Bottom left 
      1.0f,0.0f,0.0f,   0.0f,0.0f,1.0f, //Top Left 
      1.0f,1.0f,0.0f,   0.0f,0.0f,1.0f, //Top Right 
      0.0f,1.0f,0.0f,   0.0f,0.0f,1.0f, //Bottom Right 

      0.5f,0.5f,0.0f,   0.0f,0.0f,1.0f, //Center 
     }; 

如果我評論了這一點,沒有平局。使用它,我得到了很好的四我期待

 memcpy(iva, &draw, sizeof(draw)); 
     . . . OpenGl methods 

//Add the quad details to the render queue 
-(void)addDetailsToRenderQueue:(quad *)details 
{ 
    if(iva == NULL) 
     NSLog(@"Error claiming memory, something is very wrong"); 

    if(renderCount + 1 > MAX_QUADS){ 
     NSLog(@"Render buffer full, dumping..."); 
     [self render]; 
    } 

    memcpy((quad *)iva + renderCount++, &details, sizeof(quad)); 
} 

//Render the details in the render queue, for each quad we need to make two triangles. 
-(void)render 
{ 
    int counter = 0; 

    renderCount *= 5; 

    for(int i;i < renderCount;){ 
     ivaIndices[counter++] = i + 0;  // Bottom left 
     ivaIndices[counter++] = i + 1;  //Top Left 
     ivaIndices[counter++] = i + 4;  //Center 

     ivaIndices[counter++] = i + 1;  //Top Left 
     ivaIndices[counter++] = i + 2;  //Top right 
     ivaIndices[counter++] = i + 4;  //Center 

     ivaIndices[counter++] = i + 2;  //Top right 
     ivaIndices[counter++] = i + 3;  //Bottom right 
     ivaIndices[counter++] = i + 4;  //Center 

     ivaIndices[counter++] = i + 3;  //Bottom right 
     ivaIndices[counter++] = i + 0;  //Bottom Left 
     ivaIndices[counter++] = i + 4;  //Center 

     i += 5; 
    } 
    glBindVertexArrayOES(_vertexArray); 

    glDrawElements(GL_LINE_STRIP,12, GL_UNSIGNED_SHORT, ivaIndices); 

    // Reset the number of quads which need to be rendered 
    renderCount = 0; 
} 

片管理方法

@interface TileSet : NSObject 
{ 
    quad *tiles; 
    NSUInteger tileCount; 

    RenderManager *sharedRenderManager; 
} 

-(id)init 
{ 
    if([super init]){ 
     tiles = calloc(MAX_HEIGHT * MAX_WIDTH, sizeof(quad)); 
     tileCount = 0; 

     sharedRenderManager = [RenderManager sharedManager]; 
    } 
    [self fillArray]; 
    return self; 
} 

-(void)fillArray 
{ 
    int rows = 4; 
    int columns = 12; 

    for(int i = 0; i < rows;i += 2) { 
     for(int j = 0;j < columns;j += 2) { 
      quad tmp; 

      tmp.v1.x = i; 
      tmp.v1.y = j; 
      tmp.v1.z = 0.0f; 
      tmp.v1.nx = 0.0f; 
      tmp.v1.ny = 0.0f; 
      tmp.v1.nz = 1.0f; 

      tmp.v2.x = i + 1; 
      tmp.v2.y = j; 
      tmp.v2.z = 0.0f; 
      tmp.v2.nx = 0.0f; 
      tmp.v2.ny = 0.0f; 
      tmp.v2.nz = 1.0f; 

      tmp.v3.x = i; 
      tmp.v3.y = j+1; 
      tmp.v3.z = 0.0f; 
      tmp.v3.nx = 0.0f; 
      tmp.v3.ny = 0.0f; 
      tmp.v3.nz = 1.0f; 

      tmp.v4.x = i + 1; 
      tmp.v4.y = j+1; 
      tmp.v4.z = 0.0f; 
      tmp.v4.nx = 0.0f; 
      tmp.v4.ny = 0.0f; 
      tmp.v4.nz = 1.0f; 

      tmp.v5.x = i + 0.5; 
      tmp.v5.y = j + 0.5; 
      tmp.v5.z = 0.0f; 
      tmp.v5.nx = 0.0f; 
      tmp.v5.ny = 0.0f; 
      tmp.v5.nz = 1.0f; 

      memcpy((quad *)tiles + (i*j + j), &tmp, sizeof(quad)); 
      tileCount++; 
     } 
    } 
} 

//Draw the tiles in the tileset, loop through and add to renderManagers queue 
-(void)render 
{ 
for(int i = 0; i < tileCount;i++) 
    [sharedRenderManager addDetailsToRenderQueue:&tiles[0]]; 

} 

編輯 在答覆問題,添加

NSLog(@"Tiles:%x\tDisgusting pointer math:%x",tiles,(quad *)tiles + (i*j + j)); 

給的結果

2011-10-21 21:29:21.456 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:7316200 
2011-10-21 21:29:21.458 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73162f0 
2011-10-21 21:29:21.463 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73163e0 
2011-10-21 21:29:21.464 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73164d0 
2011-10-21 21:29:21.465 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73165c0 
2011-10-21 21:29:21.465 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:7316200 
2011-10-21 21:29:21.466 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73164d0 
2011-10-21 21:29:21.467 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73167a0 
2011-10-21 21:29:21.470 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:7316a70 
2011-10-21 21:29:21.470 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:7316d40 
+0

的NSLog(@ 「%X%X」,...)tiles'的''(四*)瓷磚的地址和+(I * J + j)的',我覺得計算出的地址不是您所期望的。 –

+0

現在那個指針值是你期望的那個值嗎?或者它應該是什麼? –

+0

老實說我不是很確定我在期待什麼。似乎不正確。 – botptr

回答

0

你在memcpy的量應爲(i*MAX_HEIGHT + j)。你想用「i」(外循環)跳行並用「j」(內循環)依次鑽入它們。

希望這有助於