2012-11-01 29 views
6

编辑:我已经剥离出来的所有纹理和法线贴图,但问题仍然存在用new关键字创建的C++对象不渲染;在栈上创建的对象确实

我试图绘制地形的一块屏幕上。渲染功能如下:

void TerrainChunk::Render() 
{ 
    std::cout << "Render Me!\n"; 
    glColor3f(0.5f, 0.5f, 0.5f) 
    glDisable(GL_LIGHTING); 
    for(int x = 1; x < kChunkSize - 1; x++) 
    { 
     for(int z = 1; z < kChunkSize - 1; z++) 
     { 
     std::cout << height_map_[x][z] << " "; 
     glBegin(GL_TRIANGLE_STRIP); 
      glVertex3f(x, height_map_[x][z], z); 
      glVertex3f(x+1, height_map_[x+1][z], z);  
      glVertex3f(x, height_map_[x][z+1], z+1); 
      glVertex3f(x+1, height_map_[x+1][z+1], z+1); 
     glEnd(); 
     } 
     std::cout << std::endl; 
    } 
    glEnable(GL_LIGHTING); 
} 

当堆栈

TerrainChunk chunk("chunk1.png", "grass.png"); 
chunk.Init(); 

它完美的呈现上创建的对象。

当我与新

创建
TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png"); 
chunk->Init(); 

什么也不显示。在这两种情况下,都会调用Render并打印出正确的高度图。我希望这两种情况的行为是一致的。

编辑:这是根据请求的Init()代码。它所做的是加载我已经验证的高度图,每次调用Render()时都是正确的。

void TerrainChunk::Init() 
{ 
    std::cout << height_file_ << ", " << texture_file_ << std::endl; 

    //Load height map 
    SDL_Surface *temp = IMG_Load(height_file_.c_str()); 
    if(!temp) 
    { 
     printf("Failed to load chunk.\n"); 
     exit(-1); 
    } 
    Uint32 *pixels = (Uint32 *)temp->pixels; 
    for(int z = 0; z < kChunkSize; z++) 
    { 
     for(int x = 0; x < kChunkSize; x++) 
     { 
     Uint8 r, g, b; 
     SDL_GetRGB(pixels[x + z * temp->w], temp->format, &r, &g, &b); 
     height_map_[x][z] = g/12; 
     } 
    } 
} 
+0

不知道OpenGL,但是当你在动态存储中创建它时,你是否在'chunk'上调用'delete'? –

+0

您是否在完全相同的时间点创建这些对象?我猜想你可能正在做某件事情,你没有一个有效的上下文。在chunk-> Init()之后放置一些'glGetError',看看是否有任何东西出现。 – Tim

+0

你在'TerrainChunk'的析构函数中做了什么? –

回答

1

当在栈上创建时相同对象的工作,但不会当在堆上创建,反之亦然,往往不是,那是因为成员留下ununitialized。堆分配是零初始化的,堆分配不是。我建议在valgrind下运行你的程序,它很可能会告诉你什么是错的。

0

我不得不同意Luchian Grigore:当你使用它时,基于栈的版本将被自动删除;基于堆的版本只会被明确删除。

如果更改:

TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png"); 
chunk->Init(); 

要:

TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png"); 
chunk->Init(); 
delete chunk; 

结果是否不同?