将对象放入容器类时,OpenGL 不绘制
Posted
技术标签:
【中文标题】将对象放入容器类时,OpenGL 不绘制【英文标题】:OpenGL doesn't draw when objects are put in a container class 【发布时间】:2015-03-14 17:31:20 【问题描述】:我正在尝试创建一个类来描述我正在尝试渲染到屏幕的特定对象。我有一个在 main() 中运行的着色器、网格和纹理对象,它运行良好。它现在所做的只是将图像绘制到屏幕上。
但是当我将这些对象放在一个名为 Entity 的类中并尝试使用它进行渲染时,它不会绘制图像。
主要代码:
int main(int argc, char*argv[])
Display display;
display.init(); //Sets up SDL and glew
Shaders shaders("basicShader");
Mesh mesh(shaders.getProgram());
Texture texture("kitten.png");
Entity entity;
//Loop stuff
bool quit = false;
SDL_Event e;
double frameCounter = 0;
double time = SDL_GetTicks();
while (!quit)
while (SDL_PollEvent(&e))
if (e.type == SDL_QUIT)
quit = true;
if (e.type == SDL_KEYDOWN)
if (e.key.keysym.sym == SDLK_ESCAPE)
quit = true;
++frameCounter;
if (SDL_GetTicks() - time >= 500)
std::cout << "FPS: " << frameCounter / ((SDL_GetTicks() - time) / 1000) << std::endl;
frameCounter = 0;
time = SDL_GetTicks();
// Clear the screen to black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
mesh.draw();
//entity.render();
// Swap buffers
display.render();
mesh.~Mesh();
entity.~Entity();
display.~Display();
return 0;
实体标题:
#pragma once
#include "Mesh.h"
#include "Shaders.h"
#include "Texture.h"
class Entity
public:
Entity();
void render();
~Entity();
private:
Mesh mesh;
Shaders shaders;
Texture texture;
;
实体类代码:
#include "Entity.h"
Entity::Entity()
shaders = Shaders("basicShader");
mesh = Mesh(shaders.getProgram());
texture = Texture("kitten.png");
void Entity::render()
mesh.draw();
Entity::~Entity()
mesh.~Mesh();
当 mesh.draw() 未注释并且 entity.render() 在 main() 中被注释时,此代码有效,但反之则不行。如有必要,我可以从标题和其他类中发布代码。
【问题讨论】:
所有这些显式的析构函数调用是怎么回事?你确定你在那里做什么? 并非如此。过去,除非我把它们放在那里,否则我在退出时遇到程序挂起的问题。目前这似乎是你的权利,我不需要它们。我是这方面的新手,所以我还在努力。 请同时显示Entity
类的定义(标题中的内容)。另外,您是 C++ 新手,您可能想要获取good C++ book。
@Xerict:您必须绝对从更简单的示例开始,而不是从 OpenGL 开始。那不是初学者的东西!您在这里的析构函数调用是非常错误的。在 C++ 中,本地对象会自行销毁。您应该了解带有典型迷你示例的类,例如 Animal
或 Person
...
这与最近的问题非常相似:***.com/questions/28929452。我的回答解释了在 C++ 类中包装 OpenGL 对象的一些缺陷,尤其是在使用容器时。如果你不小心的话,很容易打到自己的脚。
【参考方案1】:
Reto Koradi 链接到他对另一个问题的回答帮助解决了这个问题:Mesh class called with default constructor not working OpenGL C++
为了解决这个问题,我将对象声明为 Entity 类中的指针并像这样初始化:
实体标题:
#pragma once
#include "Mesh.h"
#include "Shaders.h"
#include "Texture.h"
class Entity
public:
Entity();
void render();
~Entity();
private:
Mesh* mesh;
Shaders* shaders;
Texture* texture;
;
实体构造函数:
Entity::Entity()
shaders = new Shaders("basicShader");
mesh = new Mesh(shaders->getProgram());
texture = new Texture("kitten.png");
【讨论】:
大声笑..我会被诅咒的。另一个也被 OpenGL Wrappers 击中腿的人(比如我自己)。我建议在这里使用unique_ptr
而不仅仅是原始新的。
@Brandon 你并不孤单。这是一个常见的问题。我曾经在一个更大的软件包中看到它,有一些非常有趣的症状。还有几个非常困惑的软件工程师试图弄清楚发生了什么。以上是关于将对象放入容器类时,OpenGL 不绘制的主要内容,如果未能解决你的问题,请参考以下文章