将对象放入容器类时,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++ 中,本地对象会自行销毁。您应该了解带有典型迷你示例的类,例如 AnimalPerson... 这与最近的问题非常相似:***.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 不绘制的主要内容,如果未能解决你的问题,请参考以下文章

将img放入div容器中[关闭]

包含对象和容器的容器

C ++:如何将此指针传递给此类?

Ioc正解

将 C++ 容器提供给 OpenGL?

Swing 顶层容器