编辑:我已经剥离出来的所有纹理和法线贴图,但问题仍然存在用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;
}
}
}
不知道OpenGL,但是当你在动态存储中创建它时,你是否在'chunk'上调用'delete'? –
您是否在完全相同的时间点创建这些对象?我猜想你可能正在做某件事情,你没有一个有效的上下文。在chunk-> Init()之后放置一些'glGetError',看看是否有任何东西出现。 – Tim
你在'TerrainChunk'的析构函数中做了什么? –