Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;使用新关键字创建的对象不呈现;在堆栈上创建的对象不存在_C++_Opengl - Fatal编程技术网

C++ c++;使用新关键字创建的对象不呈现;在堆栈上创建的对象不存在

C++ c++;使用新关键字创建的对象不呈现;在堆栈上创建的对象不存在,c++,opengl,C++,Opengl,编辑:我已经去掉了所有纹理和法线贴图,但问题仍然存在 我试图在屏幕上画一块地形。渲染函数如下所示: 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

编辑:我已经去掉了所有纹理和法线贴图,但问题仍然存在

我试图在屏幕上画一块地形。渲染函数如下所示:

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 = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();
什么也没出现。在这两种情况下,将调用Render并打印出正确的高度贴图。我希望这两种情况表现相同

编辑:以下是请求的Init()代码。它所做的只是加载高度贴图,我已经在每次调用Render()时验证了该贴图是否正确

void TerrainChunk::Init()
{

std::cout当在堆栈上创建同一对象时,该对象工作,但在堆中创建时不工作,反之亦然,这通常是因为成员未初始化。堆分配为零初始化,而堆栈分配不是。我建议在valgrind下运行程序,它很可能会告诉您出了什么问题

我必须同意Luchian Grigore的观点:基于堆栈的版本将在使用完后自动删除;基于堆的版本只会显式删除

如果您更改:

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


结果不同吗?

不知道OpenGL,但是当您在动态存储中创建块时,是否在调用
chunk
上的
delete
它打印了Render Me!和两种情况下的正确高度映射我见过在operator new中执行零初始化的错误,但如果实例在堆栈上,这些错误将不会运行。此外,分配的内存比堆栈内存更有可能具有一致的值。根据如果堆分配的实例碰巧有一个更好的未初始化值。我会在构造函数的末尾放一个断点并检查所有成员的值。另外,你有像OpenGL Profiler这样的调试工具(在Mac上)吗?它可以拍摄OpenGL状态的快照并将其保存为文本文件。然后,您可以区分这两个文本文件的工作时间和不工作时间,并查看它们之间的区别。这非常令人难以置信。如果可能的话,我希望看到完整的代码。您绝对确定没有其他更改吗?高度图在哪里lared?如果到cout的输出相同,那么肯定会调用glVertex3f(),并且必须生成相同的输出。结论:1)代码中的其他地方存在错误,或者2)您没有仅更改初始化(无论是错误还是副作用)。
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;
      }
   }
}
TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();
TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();
delete chunk;